7 Stimmen

Das Kompilieren von boost::program_options unter Mac OS X mit g++ 4.8 (Mac Ports)

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++

9voto

Shigerello Punkte 1854

Ich vermute, dass Sie Boost mit Clang kompiliert verwenden, was nicht mit GCC kompatibel ist.

Dies liegt daran, dass die C++-Implementierung zwischen ihnen unterschiedlich ist und die STL-Klassen von Clang in einem anderen Namespace als der von GCC liegen, wobei Clang inline namespace verwendet, um Clang von dem populäreren GCC zu unterscheiden; z.B. std::basic_string ist in Clang std::__1::basic_string (durch Inline-Namespace).

Versuchen Sie den folgenden Befehl, wenn Sie "libc++" in der Ausgabe sehen, ja, dann wurde Ihr Boost mit Clang erstellt (oder "libstdc++" für GCC):

$ otool -L /opt/local/lib/libboost_program_options-mt.dylib
/opt/local/lib/libboost_program_options-mt.dylib:
    /opt/local/lib/libboost_program_options-mt.dylib (Kompatibilitätsversion 0.0.0, aktuelle Version 0.0.0)
    /usr/lib/libc++.1.dylib (Kompatibilitätsversion 1.0.0, aktuelle Version 120.0.0)
    /usr/lib/libSystem.B.dylib (Kompatibilitätsversion 1.0.0, aktuelle Version 1213.0.0)

Wenn Boost mit Clang erstellt wurde, empfehle ich Ihnen, Boost mit GCC-4.8 von MacPorts neu zu erstellen:

sudo port upgrade --force boost configure.compiler=macports-gcc-4.8

Sie finden andere verfügbare Compiler unter https://trac.macports.org/wiki/UsingTheRightCompiler#configure-compiler.

Weitere nützliche Links: http://wiki.inkscape.org/wiki/index.php/CompilingMacOsX#Compiling_with_clang_3.3_and_libc.2B.2B_.28c.2B.2B11_enabled.29_.282013.29

5voto

agi Punkte 506

Wie Shigerello bereits erwähnt hat, liegt das Problem darin, dass Boost, das mit Clang kompiliert wurde, und Boost, das mit GCC kompiliert wurde, nicht kompatibel sind.

Eine einfachere Möglichkeit, Boost mit GCC-4.8 kompiliert zu bekommen, ist einfach die gcc48-Variante von Boost zu verwenden:

sudo port install boost +gcc48

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X