Я пытаюсь скомпилировать один из примеров boost :: program_options, http://svn.boost.org/svn/boost/trunk/libs/program_options/example/first.cpp, используя gcc 4.8 (устанавливается через MacPorts). Тем не менее, я продолжаю получать ошибки:
Неопределенные символы для архитектуры x86_64: "boost :: program_options :: to_internal (std :: basic_string, std :: allocator> const)", на который ссылаются из: std :: vector, std :: allocator>, std :: allocator, std :: allocator>>> boost :: program_options :: to_internal, std :: allocator>> (std :: vector, std :: allocator>, std :: allocator, std :: allocator>>> const) в ccEWnIGV.o "boost :: program_options :: options_description :: options_description (std :: basic_string, std :: allocator> const, unsigned int, unsigned int)", на который ссылаются из: _main в ccEWnIGV.o "boost :: program_options :: invalid_option_value :: invalid_option_value (std :: basic_string, std :: allocator> const)", на который ссылаются из: void boost :: program_options :: validate (boost :: any, std :: vector, std :: allocator>, std :: allocator, std :: allocator>>> const, double *, long) в 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) ", ссылка от: 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) в 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> ) ", на которые ссылаются: boost :: program_options :: basic_command_line_parser :: extra_parser (boost :: function1, std :: allocator>, std :: basic_string, std :: allocator>>, std :: basic_string, std :: allocator> const>) в ccEWnIGV. о "boost :: program_options :: detail :: cmdline :: cmdline (std :: vector, std :: allocator>, std :: allocator, std :: allocator>>> const)", на который ссылаются из: boost :: program_options :: basic_command_line_parser :: basic_command_line_parser (int, char const * const *) в ccEWnIGV.o "boost :: program_options :: operator>, boost :: program_options :: options_description const)", на который ссылаются из: _main в ccEWnIGV.o "boost :: program_options :: abstract_variables_map :: operator [] (std :: basic_string, std :: allocator> const) const", на который ссылаются из: boost :: program_options :: variable_map :: operator [] (std :: basic_string, std :: allocator> const) const в ccEWnIGV.o "boost :: program_options :: error_with_option_name :: substitute_placeholder (std :: basic_string, std :: allocator> const) const", на который ссылаются из: vtable для boost :: program_options :: invalid_option_value в ccEWnIGV.o vtable для boost :: program_options :: validation_error в ccEWnIGV.o так далее...
Буст-библиотеки были установлены через MacPorts, поместив заголовочные файлы в /opt/local/include
и библиотечные файлы в /opt/local/lib
, Используемая команда компиляции была:
$ g++ -I/opt/local/include first.cpp -L/opt/local/lib -lboost_program_options-mt
Компиляция функций наддува только для заголовков работает нормально, используя g ++ 4.8, т.е. факториал, hermite и т. Д.
Что я нахожу странным, так это то, что этот пример компилируется, если я использую компилятор llvm-g ++:
$ llvm-g++ -I/opt/local/include first.cpp -L/opt/local/lib -lboost_program_options-mt
$ g ++ -v Используя встроенные спецификации. COLLECT_GCC = G ++ COLLECT_LTO_WRAPPER = / опт / местные / libexec / ССАГПЗ / x86_64-яблочно-darwin12 / 4.8.1 / LTO-обертка Цель: x86_64-apple-darwin12 Модель потока: posix gcc версия 4.8.1 (MacPorts gcc48 4.8.1_3)
\
$ llvm-g ++ -v Apple LLVM версия 5.0 (clang-500.2.79) (на основе LLVM 3.3svn) Цель: x86_64-apple-darwin13.0.0 Модель потока: posix
\
Почему этот пример не компилируется с gcc 4.8? Есть идеи? Есть ли способ это исправить?
Обновление: пример также компилируется с использованием clang ++
Как уже упоминал Шигерелло, проблема заключается в том, что boost скомпилирован с помощью clang, а boost скомпилирован с gcc несовместимым.
Более простой вариант, чтобы получить boost, скомпилированный с GCC-4.8, состоит в том, чтобы просто использовать gcc48 вариант boost:
sudo port install boost +gcc48
Я подозреваю, что вы используете Boost, скомпилированный с Clang, который несовместим с GCC.
Это связано с тем, что реализация C ++ отличается между ними, и классы STL Clang помещаются в пространство имен, отличное от GCC, использующего встроенное пространство имен для дифференциации Clang от более популярного GCC; например std::basic_string
является std::__1::basic_string
в Clang встроенным пространством имен).
Попробуйте команду ниже, если вы видите «Libc ++» на выходе да, ваш Boost был построен с помощью Clang (или «Libstdc ++» для 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 (compatibility version 0.0.0, current version 0.0.0)
/usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 120.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1213.0.0)
Если Boost был создан с использованием Clang, я рекомендую вам пересобрать Boost с GCC-4.8, предоставляемым MacPorts:
sudo port upgrade --force boost configure.compiler=macports-gcc-4.8
Вы можете найти другие доступные компиляторы в https://trac.macports.org/wiki/UsingTheRightCompiler#configure-compiler .
Другая полезная ссылка:
http://wiki.inkscape.org/wiki/index.php/CompilingMacOsX#Compiling_with_clang_3.3_and_libc.2B.2B_.28c.2B.2B11_enabled.29_.282013.29