Использование С++ 11 в MacOS X и сборник Boost library conundrum - программирование

Использование С++ 11 в MacOS X и сборник Boost library conundrum

Я пытаюсь скомпилировать проект С++, который широко использует стандарты С++ 11. Все было хорошо с помощью только -std = С++ 11, пока я не попытался использовать unordered_map, и MacOS просто не имеет заголовочного файла unordered_map в любом месте usr/include.

Я провел некоторое исследование и обнаружил, что использование -stdlib = libС++ исправит его (не уверенный, как это кажется мне волшебным, если включенный файл нигде в файловой системе). Конечно. Он скомпилирован хорошо, но компоновщик не может ссылаться на boost:: program_options, что моя программа также широко использует. Без -stdlib = libС++, улучшать ссылки отлично, но я теряю unordered_map.

Что мне делать, чтобы иметь последние возможности С++ 11 с компилятором Mac OS clang++ и по-прежнему иметь возможность ссылаться на дополнительные библиотеки (которые были созданы из источников на этом самом mac).

ps: все отлично работает в моем ящике для дуги

my makefile:

LIBS = -lboost_program_options CXXFLAGS = -stdlib = libС++ -std = С++ 11 -Wall -g OBJ = fastq.o fastq_reader.o main.o degenerate.o interleave.o supplement.o interval_utils.o interval.o interval_utils_test_tool.o

foghorn: $(OBJ) $(LINK.cc) -o [email protected]$^ $(LIBS)

Выход с использованием -stdlib = libС++

$make С++ -stdlib = libС++ -std = С++ 11 -Wall -g -c -o fastq.o fastq.cpp С++ -stdlib = libС++ -std = С++ 11 -Wall -g -c -o fastq_reader.o fastq_reader.cpp С++ -stdlib = libС++ -std = С++ 11 -Wall -g -c -o main.o main.cpp С++ -stdlib = libС++ -std = С++ 11 -Wall -g -c -o degenerate.o degenerate.cpp С++ -stdlib = libС++ -std = С++ 11 -Wall -g
-c -o interleave.o interleave.cpp С++ -stdlib = libС++ -std = С++ 11 -Wall -g -c -o supplement.o comple.cpp С++ -stdlib = libС++ -std = С++ 11 -Wall -g -c -o interval_utils.o interval_utils.cpp С++ -stdlib = libС++ -std = С++ 11 -Wall -g -c -o interval.o interval.cpp С++ -stdlib = libС++ -std = С++ 11 -Wall -g -c -o interval_utils_test_tool.o interval_utils_test_tool.cpp С++ -stdlib = libС++ -std = С++ 11 -Wall -g
-o foghorn fastq.o fastq_reader.o main.o degenerate.o interleave.o comple.o interval_utils.o interval.o interval_utils_test_tool.o -lboost_program_options Undefined символы для архитектуры x86_64: "boost:: program_options:: to_internal (std:: __ 1:: basic_string, std:: __ 1:: allocator > const &)", ссылка:       std:: __ 1:: vector, std:: __ 1:: allocator > , std:: __ 1:: allocator, std:: __ 1:: allocator → > boost:: program_options:: to_internal, std:: __ 1:: allocator >

(std:: __ 1:: vector, std:: __ 1:: allocator > ,   std:: __ 1:: allocator, std:: __ 1:: allocator → > const &)   в main.o

  ... [clipped output for readability]

ld: символ не найден для архитектуры x86_64 clang: error: linker команда с кодом выхода 1 (используйте -v для вызова вызова): * [foghorn] Ошибка 1

4b9b3361

Ответ 1

После большого количества исследований я узнал следующее:

  • Все на MacOS X построено с использованием stdlibС++ (включая все, что вы устанавливаете с помощью homebrew - это было моим делом)
  • stdlibС++, который поставляется с gcc 4.2, не реализует многие функции С++ 11. Примерами являются unordered_map, to_string, stoi,... только libС++.
  • libС++ установлен в MacOS с помощью XCode.

Вывод:

  • Если вы используете С++ 11, у вас есть, чтобы использовать -stdlib = libС++.
  • Если вы хотите использовать boost или любую другую библиотеку, вам также необходимо перекомпилировать их с помощью -stdlib = libС++.

Итак, я загрузил источники повышения с их сайта и скомпилировал их с помощью следующей командной строки:

bootstrap.sh && b2 toolset=clang cxxflags="-stdlib=libc++" linkflags="-stdlib=libc++" install

Если вы используете Homebrew, вы можете сделать это, и он будет делать правильные вещи для вас:

brew install boost --c++11