Связывание libc++ с проектом CMake в Linux

Я хочу использовать libc++ вместе с clang в Arch Linux в проекте CMake. Я установил libc++ и добавил следующие строки в CMakeLists.txt, как указано на сайте LLVM в разделе Linux "Использование libc++ в ваши программы":

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -stdlib=libc++")
set(CMAKE_EXE_LINKER_FLAGS "-lc++abi")

Я пробовал просто "++abi" в флагах компоновщика, но это не помогло. Мне нужна помощь в выяснении того, что я должен написать в моем CMakeLists.txt.


person Ostrea    schedule 27.11.2014    source источник
comment
какое сообщение об ошибке вы получаете?   -  person Richard Hodges    schedule 28.11.2014
comment
@RichardHodges CMake не выдает никаких сообщений об ошибках, но когда я пытаюсь использовать, например, std::string, clang выдает следующее сообщение: implicit instantiation of undefined template 'std::__l::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>'   -  person Ostrea    schedule 28.11.2014
comment
похоже, вы не #include <string>   -  person Richard Hodges    schedule 28.11.2014
comment
@RichardHodges Я сделал, и когда я использую libstdc++, все работает отлично   -  person Ostrea    schedule 28.11.2014
comment
попробуйте добавить -lc++ в командную строку компоновщика.   -  person Richard Hodges    schedule 28.11.2014
comment
@RichardHodges, как я могу сделать это в CMake? Я пытался использовать CMAKE_EXE_LINKER_FLAGS, как показано в моем вопросе, но это не помогло.   -  person Ostrea    schedule 28.11.2014
comment
попробуй так: set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -lc++ -lc++abi")   -  person Richard Hodges    schedule 28.11.2014
comment
@RichardHodges это не помогло   -  person Ostrea    schedule 28.11.2014


Ответы (2)


Не забудьте установить для компилятора clang++:

set(CMAKE_CXX_COMPILER "clang++")

Кроме того, очистите сгенерированные файлы cmake (удалите папки CMakeFiles и CMakeCache.txt).

В зависимости от вашей системы может также помочь установить

set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -stdlib=libc++ -lc++abi")
person emw    schedule 04.02.2015
comment
Хм, я получаю сообщение об ошибке: CMAKE_CXX_COMPILER: clang++ не является полным путем и не был найден в PATH. Сообщите CMake, где найти компилятор, задав для переменной среды CXX или записи кэша CMake CMAKE_CXX_COMPILER полный путь к компилятору или имя компилятора, если оно находится в PATH. Ничего страшного, могу поставить компилятор в конфиге. (Я не хочу задавать весь путь.) - person Flash Sheridan; 24.10.2018
comment
Я попробовал этот метод, но все еще с ошибкой связывания, жалуясь, что std::cout является неопределенной ссылкой. - person ChrisZZ; 12.06.2021

Правильный способ сделать это в CMake на данный момент, пока не будет добавлена ​​конкретная базовая функция для переключения стандартных библиотек, то есть использовать файл цепочки инструментов.

В этом файле набора инструментов вы указываете компилятор и т. д., как и в других ответах здесь.

НО, что хорошо в цепочках инструментов, так это то, что их можно быстро заменить либо в командной строке (используя -DCMAKE_TOOLCHAIN_FILE=путь/к/файлу), либо в VSCode с установленным расширением CMakeTools и, возможно, в других редакторах.

Но необходимость вручную кодировать свои собственные файлы набора инструментов — еще одна непонятная рутинная работа! Не весело!

К счастью, я наткнулся на этот github, который поддерживает их набор, поэтому вам не нужно писать их с нуля! Должно быть намного меньше шансов ошибиться.

https://github.com/ruslo/polly

person Daniel Russell    schedule 20.07.2020