【问题标题】:How to add the option `llvm-config --cxxflags --ldflags --libs` in CMake?如何在 CMake 中添加选项 `llvm-config --cxxflags --ldflags --libs`?
【发布时间】:2018-09-13 09:55:34
【问题描述】:

有谁知道如何将选项`llvm-config --cxxflags --ldflags --libs` 添加到 CMake 中?对我来说棘手的部分是反引号`

我需要配置我的 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

我可以使用include_directories(usr/lib/llvm-6.0/include)传递-I/usr/lib/llvm-6.0/include

但是,我仍然不知道如何将部分 -L/usr/lib/llvm-6.0/lib -lLLVM-6.0 传递给 CMake。像下面这样使用 link_directoriestarget_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,如 herehere 所述。在那之后,最棘手的部分是正确使用此输出:因为它不仅包含编译器选项,还包含链接器选项,因此您不能只分配CMAKE_CXX_FLAGS。您还应该使用CMAKE_EXE_LINKER_FLAGS 和命令link_directorieslink_libraries
  • 我尝试了execute_process(COMMAND bash "-c" "llvm-config --cxxflags --ldflags --libs" OUTPUT_VARIABLE CMD_OUTPUT) 之类的命令,并将其设置为CMAKE_CXX_FLAGSCMAKE_EXE_LINKER_FLAGS,但它不起作用。
  • 应该是COMMAND llvm-config --cxxflags --ldflags --libs - 用引号括起来是错误的。您也可以使用execute_processRESULT_VARIABLE 选项来检查命令执行是否成功。
  • 抱歉,没有看到您的更新。使用link_directoriestarget_link_libraries 的方法应该可以工作。你能解释一下,在那种情况下究竟是什么“不起作用”? (来自 CMake、编译器或链接器的错误)。此外,使用make VERBOSE=1,您可能会看到 CMake 生成的用于编译和链接可执行文件的命令行。
  • KDevelop 有一个简洁的模块用于查找 LLVM 和 Clang:cgit.kde.org/kdevelop.git/tree/cmake/modules/FindLLVM.cmake

标签: cmake clang llvm


【解决方案1】:

LLVM/Clang 使用 CMake 并提供一个配置模块,因此任何尝试使用 LLVM/Clang 的项目只需要一个 find_package(Clang...) 将导出的目标带入一个范围(并且 不要'不需要使用任何外部工具(如llvm-configpkg-config blah-blah))。这意味着在 Clang 找到之后,您可以使用 target_link_libraries(blah Clang::clangBasic ...) 而无需执行任何“手动导入”或 cmets 中的任何 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

我使用了从deb http://apt.llvm.org/xenial/ llvm-toolchain-xenial-6.0 main repo 安装的 Clang 6.0。

【讨论】:

  • 感谢您的建议和解释!
猜你喜欢
  • 2022-01-13
  • 2012-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多