Компиляция boost :: program_options в Mac OS X с g ++ 4.8 (порты Mac)

Я пытаюсь скомпилировать один из примеров 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 ++

6

Решение

Как уже упоминал Шигерелло, проблема заключается в том, что boost скомпилирован с помощью clang, а boost скомпилирован с gcc несовместимым.

Более простой вариант, чтобы получить boost, скомпилированный с GCC-4.8, состоит в том, чтобы просто использовать gcc48 вариант boost:

sudo port install boost +gcc48
5

Другие решения

Я подозреваю, что вы используете 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

9

По вопросам рекламы [email protected]