如何在CMake中添加`llvm-config --cxxflags --ldflags --libs`选项?

时间:2018-09-13 09:55:35

标签: cmake clang llvm

有人知道如何将选项`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

我可以使用-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_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")

但是,这是手动操作,我仍在寻找更好的解决方案...

1 个答案:

答案 0 :(得分:2)

LLVM / Clang使用CMake并提供一个 config模块,因此,任何尝试使用LLVM / Clang的项目都只需一个find_package(Clang...)即可将导出的目标带入范围(和不需要使用任何外部工具(例如llvm-configpkg-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

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