0

I have some C++ code that compiles nicely on Linux but so far I'm having trouble getting it to compile correctly on NetBSD.

These are my includes:

#include <fstream>
#include <iostream>
#include <cstdlib>
#include <unistd.h>
#include <iomanip>
#include <boost/regex.hpp>

I compile with this command:

g++ -v -O2 -fno-strict-aliasing -I /usr/pkg/include \
barefoot.cpp -o barefoot -L /usr/pkg/lib/ -lboost_regex \
-L /usr/pkg/lib/ -lboost_regex -lpthreads

Which renders this output:

Using built-in specs.
COLLECT_GCC=g++
Target: x86_64--netbsd

Configured with: /usr/src2/tools/gcc/../../external/gpl3/gcc/dist/configure --target=x86_64--netbsd --enable-long-long --enable-threads --with-bugurl=http://www.NetBSD.org/Misc/send-pr.html --with-pkgversion='NetBSD nb2 20111202' --enable-__cxa_atexit --with-tune=nocona --with-mpc=/var/obj/mknative/amd64/usr/src2/destdir.amd64/usr --with-mpfr=/var/obj/mknative/amd64/usr/src2/destdir.amd64/usr --with-gmp=/var/obj/mknative/amd64/usr/src2/destdir.amd64/usr --enable-tls --disable-multilib --disable-symvers --disable-libstdcxx-pch --build=x86_64-unknown-netbsd5.99.56 --host=x86_64--netbsd

Thread model: posix

gcc version 4.5.3 (NetBSD nb2 20110806) 
COLLECT_GCC_OPTIONS='-v' '-O2' '-fno-strict-aliasing' '-I' '/usr/pkg/include/' '-o' 'a.out' '-L' '/usr/pkg/lib/' '-mtune=nocona' '-march=x86-64'
 /usr/libexec/cc1plus -quiet -v -I /usr/pkg/include/ barefoot.cpp -quiet -dumpbase barefoot.cpp -mtune=nocona -march=x86-64 -auxbase barefoot -O2 -version -fno-strict-aliasing -o /var/tmp//cc9Dcmwi.s
GNU C++ (NetBSD nb2 20110806) version 4.5.3 (x86_64--netbsd)
        compiled by GNU C version 4.5.3, GMP version 5.0.2, MPFR version 3.0.1-p4, MPC version 0.9

GGC heuristics: --param ggc-min-expand=99 --param ggc-min-heapsize=131007
#include "..." search starts here:
#include <...> search starts here:
 /usr/pkg/include/
 /usr/include/g++
 /usr/include/g++/backward
 /usr/include/gcc-4.5
 /usr/include
End of search list.

GNU C++ (NetBSD nb2 20110806) version 4.5.3 (x86_64--netbsd)
        compiled by GNU C version 4.5.3, GMP version 5.0.2, MPFR version 3.0.1-p4, MPC version 0.9
GGC heuristics: --param ggc-min-expand=99 --param ggc-min-heapsize=131007
Compiler executable checksum: a34e7d170f4dd8d4687d2b62e8dca4b7
In file included from /usr/include/g++/bits/gthr.h:166:0,
                 from /usr/include/g++/ext/atomicity.h:34,
                 from /usr/include/g++/bits/ios_base.h:41,
                 from /usr/include/g++/ios:43,
                 from /usr/include/g++/istream:40,
                 from /usr/include/g++/fstream:40,
                 from barefoot.cpp:29:
/usr/include/g++/bits/gthr-default.h:130:9: error: 'pthread_detach' was not declared in this scope
/usr/include/g++/bits/gthr-default.h:130:1: error: invalid type in declaration before ';' token
/usr/include/g++/bits/gthr-default.h: In function 'int __gthread_detach(pthread_st*)':
/usr/include/g++/bits/gthr-default.h:668:46: error: '__gthrw_pthread_detach' cannot be used as a function
In file included from /usr/pkg/include/boost/regex/v4/regex_workaround.hpp:25:0,
                 from /usr/pkg/include/boost/regex/v4/regex.hpp:32,
                 from /usr/pkg/include/boost/regex.hpp:31,
                 from barefoot.cpp:32:
/usr/include/g++/cstdlib: At global scope:
/usr/include/g++/cstdlib:132:11: error: '::system' has not been declared

I tried adding -lpthread, but that resulted in the same output. Not sure what to try next.

jxh
  • 69,070
  • 8
  • 110
  • 193
  • 1
    Looks like you forgot to `#include` a required header, e.g. `` or `` ? – Paul R Jun 19 '15 at 22:27
  • Thanks. I added unistd.h but no change. Same exact output. – Klaatu von Schlacker Jun 19 '15 at 23:03
  • 1
    Try adding `-pthread`, not `-lpthread`. – jxh Jun 19 '15 at 23:07
  • -pthread renders the same error. – Klaatu von Schlacker Jun 19 '15 at 23:35
  • Try including `` at the top of your includes, then. – jxh Jun 19 '15 at 23:35
  • No, including pthread.h at the top of includes and running g++ -v -O2 -using-std=c++11 -fno-strict-aliasing -I /usr/pkg/include/ barefoot.cpp -o working -L /usr/pkg/lib -lboost_regex -pthread renders the same error. – Klaatu von Schlacker Jun 19 '15 at 23:48
  • 2
    The first error states that `pthread_detach` is missing. Find out which `pthread.h` file your system is including, and then check that `pthread_detach` is inside it. Then, check what `#if` guards prevent it from being visible. Then check why your system defines the macros that prevent it from being visible. – jxh Jun 20 '15 at 00:02
  • @jxh if you submit that as an answer, I will accept it. I will have to install BSD on a local box that I control in order to test further, but your explanation is very enlightening. Thank you. – Klaatu von Schlacker Jun 20 '15 at 00:49

1 Answers1

2

I do not know exactly why you are facing this problem, but I can provide you with some next steps to try.

  • Notice that the first error is that pthread_detach is missing. The system header files will typically make sure whatever headers they need are included, but you can try adding <pthread.h> above all the other headers.

  • If that fails, you need to figure out which file got included as a result of adding #include <pthread.h>, and make sure pthread_detach is present inside it (it really should be there somewhere).

  • Assuming it is there, there must be some conditional compilation that is causing it to not be visible to your source code. Find the conditional guards, and what macro values affect it.

  • Then, you will need to see why your system is defining the macro values in a way that causes the function pthread_detach to not be visible.

With this investigation, you may discover that you are not including the right <pthread.h> file. This may be due to system include directories conflicting with the include directories you want to use.

This answer (it is towards the bottom) to this question shows how to display the predefined macros for the g++ compiler.

Community
  • 1
  • 1
jxh
  • 69,070
  • 8
  • 110
  • 193