Кто-нибудь знает, как добавить в CMake опцию `llvm-config --cxxflags --ldflags --libs`? Сложность для меня - обратная кавычка `.
Мне нужно настроить мои файлы CMake, чтобы получить команду компиляции, например:
g++ test.cpp -lclangBasic -I/usr/lib/llvm-6.0/include
-Wall `llvm-config --cxxflags --ldflags --libs`
Я пробовал использовать следующие варианты, но они не работают:
add_compile_options(`llvm-config --cxxflags --ldflags --libs`)
# or
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} `llvm-config --cxxflags --ldflags --libs`")
Заранее спасибо.
===============
Обновление 1.
Используя вывод `llvm-config --cxxflags --ldflags --libs`, я могу успешно скомпилировать следующую команду:
g++ test.cpp -lclangBasic -I/usr/lib/llvm-6.0/include
-Wall -I/usr/lib/llvm-6.0/include -L/usr/lib/llvm-6.0/lib -lLLVM-6.0
Я могу передать -I/usr/lib/llvm-6.0/include с помощью include_directories(usr/lib/llvm-6.0/include).
Но все же я не знаю, как передать часть -L/usr/lib/llvm-6.0/lib -lLLVM-6.0 в CMake. Использование link_directories и target_link_libraries, как показано ниже, у меня не работает:
link_directories(/usr/lib/llvm-6.0/lib)
target_link_libraries(test PUBLIC "LLVM-6.0")
Кто-нибудь знает, как заставить их работать в CMake?
===============
Обновление 2.
Мне нужно добавить следующий код в файл CMakeLists.txt, чтобы CMake заработал.
add_library(LLVM-6.0 SHARED IMPORTED) # or STATIC instead of SHARED
set_target_properties(LLVM-6.0 PROPERTIES
IMPORTED_LOCATION "/usr/lib/llvm-6.0/lib/libLLVM-6.0.so"
INTERFACE_INCLUDE_DIRECTORIES "/usr/lib/llvm-6.0/include"
)
add_library(clangBasic SHARED IMPORTED) # or STATIC instead of SHARED
set_target_properties(clangBasic PROPERTIES
IMPORTED_LOCATION "/usr/lib/llvm-6.0/lib/libclangBasic.a"
INTERFACE_INCLUDE_DIRECTORIES "/usr/lib/llvm-6.0/include"
)
target_link_libraries(solidity PUBLIC "LLVM-6.0;clangBasic")
Однако это выглядит вручную, и я все еще ищу лучшие решения ...
Я попробовал такую команду, как execute_process(COMMAND bash "-c" "llvm-config --cxxflags --ldflags --libs" OUTPUT_VARIABLE CMD_OUTPUT), и послал ее как CMAKE_CXX_FLAGS, так и CMAKE_EXE_LINKER_FLAGS, но она не работает.
Должен быть COMMAND llvm-config --cxxflags --ldflags --libs - оборачивать кавычками неправильно. Также вы можете использовать опцию RESULT_VARIABLE для execute_process для проверки успешности выполнения команды.
Извините, я не видел ваше обновление. Подход с link_directories и target_link_libraries должен работать. Не могли бы вы объяснить, что именно в этом случае «не работает»? (ошибка от CMake, компилятора или компоновщика). Кроме того, с make VERBOSE=1 вы можете видеть командные строки, которые CMake генерирует для компиляции и компоновки вашего исполняемого файла.
В KDevelop есть удобный модуль для поиска LLVM и Clang: cgit.kde.org/kdevelop.git/tree/cmake/modules/FindLLVM.cmake
@arrowd: Спасибо за предложение. Я это попробую.
@Tsyvarev: Кое-как функция link_directories не работает с новым CMake (в моем случае это 3.10.2). Я видел еще один комментарий в этом сообщении, подтверждающий эту проблему с новым CMake: stackoverflow.com/a/28606916/3631532. В настоящее время я должен использовать команду set_target_properties... и абсолютный путь LLVM.
Хорошо, я помню, что: link_directories должен быть выдан до, создавая цель (add_executable в вашем случае). Если это вас не устраивает, вы можете использовать команду find_library для поиска библиотеки по имени, заданному флагом -l, в каталогах, заданных флагом -L в выводе llvm-config. Нечто подобное делает модуль FindPkgConfig.cmake, преобразующий вывод pkg-config для CMake.
LLVM / Clang использует CMake для самостоятельной сборки и предоставления экспортируемых целей. Вам нужно подключиться к find_package и поместить эти цели в прицел. Не нужно использовать какие-либо внешние инструменты ...





LLVM / Clang использует CMake и предоставляет модуль конфигурации, поэтому любому проекту, пытающемуся использовать LLVM / Clang, просто нужен find_package(Clang...) для переноса экспортируемых целей в область видимости (и не нужно для использования любых внешних инструментов (например, llvm-config или pkg-config blah-blah)). Это означает, что после того, как Clang обнаружит, вы можете использовать target_link_libraries(blah Clang::clangBasic ...), и вам не нужно выполнять какой-либо «ручной импорт» или что-то еще, что предлагает ppl в комментариях ...
В качестве быстрой проверки можно использовать следующую команду:
$ cmake --find-package -DNAME=Clang -DCOMPILER_ID=GNU -DLANGUAGE=CXX -DMODE=EXIST
Clang found.
$ cmake --find-package -DNAME=Clang -DCOMPILER_ID=GNU -DLANGUAGE=CXX -DMODE=COMPILE
-I/usr/lib/llvm-6.0/include
Я использовал Clang 6.0, установленный из репозитория deb http://apt.llvm.org/xenial/ llvm-toolchain-xenial-6.0 main.
Спасибо за предложение и объяснение!
«Сложная часть для меня - это обратная кавычка» - для оценки командной строки используйте
execute_process, как описано здесь или здесь. После этого самая сложная часть - правильно использовать этот вывод: поскольку он содержит не только параметры компилятора, но и параметры компоновщика, вы не можете просто назначитьCMAKE_CXX_FLAGS. Вы также должны использоватьCMAKE_EXE_LINKER_FLAGSи командыlink_directoriesиlink_libraries.