Как добавить опцию `llvm-config --cxxflags --ldflags --libs` в CMake?

Кто-нибудь знает, как добавить в 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, как описано здесь или здесь. После этого самая сложная часть - правильно использовать этот вывод: поскольку он содержит не только параметры компилятора, но и параметры компоновщика, вы не можете просто назначить CMAKE_CXX_FLAGS. Вы также должны использовать CMAKE_EXE_LINKER_FLAGS и команды link_directories и link_libraries.

Tsyvarev 13.09.2018 12:09

Я попробовал такую ​​команду, как execute_process(COMMAND bash "-c" "llvm-config --cxxflags --ldflags --libs" OUTPUT_VARIABLE CMD_OUTPUT), и послал ее как CMAKE_CXX_FLAGS, так и CMAKE_EXE_LINKER_FLAGS, но она не работает.

Trung Ta 13.09.2018 14:07

Должен быть COMMAND llvm-config --cxxflags --ldflags --libs - оборачивать кавычками неправильно. Также вы можете использовать опцию RESULT_VARIABLE для execute_process для проверки успешности выполнения команды.

Tsyvarev 13.09.2018 15:31

Извините, я не видел ваше обновление. Подход с link_directories и target_link_libraries должен работать. Не могли бы вы объяснить, что именно в этом случае «не работает»? (ошибка от CMake, компилятора или компоновщика). Кроме того, с make VERBOSE=1 вы можете видеть командные строки, которые CMake генерирует для компиляции и компоновки вашего исполняемого файла.

Tsyvarev 13.09.2018 16:38

В KDevelop есть удобный модуль для поиска LLVM и Clang: cgit.kde.org/kdevelop.git/tree/cmake/modules/FindLLVM.cmake

arrowd 13.09.2018 17:47

@arrowd: Спасибо за предложение. Я это попробую.

Trung Ta 14.09.2018 05:12

@Tsyvarev: Кое-как функция link_directories не работает с новым CMake (в моем случае это 3.10.2). Я видел еще один комментарий в этом сообщении, подтверждающий эту проблему с новым CMake: stackoverflow.com/a/28606916/3631532. В настоящее время я должен использовать команду set_target_properties... и абсолютный путь LLVM.

Trung Ta 14.09.2018 05:18

Хорошо, я помню, что: link_directories должен быть выдан до, создавая цель (add_executable в вашем случае). Если это вас не устраивает, вы можете использовать команду find_library для поиска библиотеки по имени, заданному флагом -l, в каталогах, заданных флагом -L в выводе llvm-config. Нечто подобное делает модуль FindPkgConfig.cmake, преобразующий вывод pkg-config для CMake.

Tsyvarev 14.09.2018 11:39

LLVM / Clang использует CMake для самостоятельной сборки и предоставления экспортируемых целей. Вам нужно подключиться к find_package и поместить эти цели в прицел. Не нужно использовать какие-либо внешние инструменты ...

zaufi 17.09.2018 20:02
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
9
1 737
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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.

Спасибо за предложение и объяснение!

Trung Ta 19.09.2018 04:13

Другие вопросы по теме