Ich versuche, eines der boost::program_options Beispiele zu kompilieren, http://svn.boost.org/svn/boost/trunk/libs/program_options/example/first.cpp, mit gcc 4.8 (installiert über MacPorts). Aber ich bekomme immer Fehlermeldungen:
Undefined symbols for architecture x86\_64:
"boost::program\_options::to\_internal(std::basic\_string, std::allocator > const&)", referenziert von:
std::vector, std::allocator >, std::allocator, std::allocator > > > boost::program\_options::to\_internal, std::allocator > >(std::vector, std::allocator >, std::allocator, std::allocator > > > const&) in ccEWnIGV.o
"boost::program\_options::options\_description::options\_description(std::basic\_string, std::allocator > const&, unsigned int, unsigned int)", referenziert von:
\_main in ccEWnIGV.o
"boost::program\_options::invalid\_option\_value::invalid\_option\_value(std::basic\_string, std::allocator > const&)", referenziert von:
void boost::program\_options::validate(boost::any&, std::vector, std::allocator >, std::allocator, std::allocator > > > const&, double\*, long) in ccEWnIGV.o
"boost::program\_options::error\_with\_option\_name::error\_with\_option\_name(std::basic\_string, std::allocator > const&, std::basic\_string, std::allocator > const&, std::basic\_string, std::allocator > const&, int)", referenziert von:
boost::program\_options::validation\_error::validation\_error(boost::program\_options::validation\_error::kind\_t, std::basic\_string, std::allocator > const&, std::basic\_string, std::allocator > const&, int) in ccEWnIGV.o
"boost::program\_options::detail::cmdline::set\_additional\_parser(boost::function1, std::allocator >, std::basic\_string, std::allocator > >, std::basic\_string, std::allocator > const&>)", referenziert von:
boost::program\_options::basic\_command\_line\_parser::extra\_parser(boost::function1, std::allocator >, std::basic\_string, std::allocator > >, std::basic\_string, std::allocator > const&>) in ccEWnIGV.o
"boost::program\_options::detail::cmdline::cmdline(std::vector, std::allocator >, std::allocator, std::allocator > > > const&)", referenziert von:
boost::program\_options::basic\_command\_line\_parser::basic\_command\_line\_parser(int, char const\* const\*) in ccEWnIGV.o
"boost::program\_options::operator >&, boost::program\_options::options\_description const&)", referenziert von:
\_main in ccEWnIGV.o
"boost::program\_options::abstract\_variables\_map::operator\[\](std::basic\_string, std::allocator > const&) const", referenziert von:
boost::program\_options::variables\_map::operator\[\](std::basic\_string, std::allocator > const&) const in ccEWnIGV.o
"boost::program\_options::error\_with\_option\_name::substitute\_placeholders(std::basic\_string, std::allocator > const&) const", referenziert von:
vtable for boost::program\_options::invalid\_option\_value in ccEWnIGV.o
vtable for boost::program\_options::validation\_error in ccEWnIGV.o
usw...
Die Boost-Bibliotheken wurden über MacPorts installiert, wobei die Header-Dateien in /opt/local/include
und die Bibliotheksdateien in /opt/local/lib
platziert wurden. Der verwendete Kompilierungsbefehl war:
$ g++ -I/opt/local/include first.cpp -L/opt/local/lib -lboost_program_options-mt
Das Kompilieren von Header-Only-Boost-Funktionen funktioniert gut mit g++ 4.8, z.B. Fakultät, Hermite usw.
Was ich seltsam finde, ist, dass dieses Beispiel kompiliert, wenn ich den llvm-g++ Compiler verwende:
$ llvm-g++ -I/opt/local/include first.cpp -L/opt/local/lib -lboost_program_options-mt
$ g++ -v
Using built-in specs.
COLLECT\_GCC=g++
COLLECT\_LTO\_WRAPPER=/opt/local/libexec/gcc/x86\_64-apple-darwin12/4.8.1/lto-wrapper
Target: x86\_64-apple-darwin12
Thread model: posix
gcc version 4.8.1 (MacPorts gcc48 4.8.1\_3)
\\ $ llvm-g++ -v
Apple LLVM version 5.0 (clang-500.2.79) (based on LLVM 3.3svn)
Target: x86\_64-apple-darwin13.0.0
Thread model: posix
\\
Warum kompiliert dieses Beispiel nicht mit gcc 4.8? Irgendwelche Ideen? Gibt es einen Weg, das zu beheben?
Aktualisierung: Das Beispiel kompiliert auch mit clang++