CMake:如何在 CMakeLists.txt 内构建多个库?
CMake: How to build multiple libraries within the CMakeLists.txt?
我尝试使用 LLVM 在单个项目中创建多个模块:
cmake_minimum_required(VERSION 3.5.1)
project("SplitWMPass")
add_library(SplitWMPass MODULE
# List your source files here.
SplitWMPass.cpp
)
add_library(WMCheckerTPass MODULE
WMCheckerTPass.cpp)
# LLVM is (typically) built with no C++ RTTI. We need to match that;
# otherwise, we'll get linker errors about missing RTTI data.
set_target_properties(SplitWMPass PROPERTIES
COMPILE_FLAGS "-fno-rtti"
)
# Get proper shared-library behavior (where symbols are not necessarily
# resolved when the shared library is linked) on OS X.
if(APPLE)
set_target_properties(SplitWMPass PROPERTIES
LINK_FLAGS "-undefined dynamic_lookup"
)
endif(APPLE)
这很好用,如果我只指定一个 add_library()
,但使用其中两个会使第二个库失败:
nlykkei@nlykkei-Ubuntu:~/llvm-ir-obfuscation$ opt -load cmake-build-debug/water/libWMCheckerTPass.so
Error opening 'cmake-build-debug/water/libWMCheckerTPass.so': cmake-build-debug/water/libWMCheckerTPass.so: undefined symbol: _ZTIN4llvm10ModulePassE
我想知道如何在项目中构建多个库?
一切正常,如果我在一个全新的文件夹中构建第二个库,它有自己的 CMakeLists.txt。
你的 CMakeLists.txt
中需要这个
set_target_properties(WMCheckerTPass PROPERTIES
COMPILE_FLAGS "-fno-rtti"
)
您的 LLVM
工具链是在禁用 RTTI(默认)的情况下构建的,但是您的新模块启用了该功能,因此您需要复制 LLVM
构建设置,因为您的库将由 opt
并且您不应该生成当前不存在的符号(就像您的错误一样)。
或者,如果您 运行 在您的终端上这样做:
c++filt _ZTIN4llvm10ModulePassE
你会得到
typeinfo for llvm::ModulePass
这是一个明确的指示。
最好也复制 LLVM
的例外设置。
请参阅基本示例 CMake 文件 here。在 LLVM
安装中与 CMake 一起查看的关键文件是 LLVMConfig.cmake
.
可以找到相关文档here。
我尝试使用 LLVM 在单个项目中创建多个模块:
cmake_minimum_required(VERSION 3.5.1)
project("SplitWMPass")
add_library(SplitWMPass MODULE
# List your source files here.
SplitWMPass.cpp
)
add_library(WMCheckerTPass MODULE
WMCheckerTPass.cpp)
# LLVM is (typically) built with no C++ RTTI. We need to match that;
# otherwise, we'll get linker errors about missing RTTI data.
set_target_properties(SplitWMPass PROPERTIES
COMPILE_FLAGS "-fno-rtti"
)
# Get proper shared-library behavior (where symbols are not necessarily
# resolved when the shared library is linked) on OS X.
if(APPLE)
set_target_properties(SplitWMPass PROPERTIES
LINK_FLAGS "-undefined dynamic_lookup"
)
endif(APPLE)
这很好用,如果我只指定一个 add_library()
,但使用其中两个会使第二个库失败:
nlykkei@nlykkei-Ubuntu:~/llvm-ir-obfuscation$ opt -load cmake-build-debug/water/libWMCheckerTPass.so
Error opening 'cmake-build-debug/water/libWMCheckerTPass.so': cmake-build-debug/water/libWMCheckerTPass.so: undefined symbol: _ZTIN4llvm10ModulePassE
我想知道如何在项目中构建多个库?
一切正常,如果我在一个全新的文件夹中构建第二个库,它有自己的 CMakeLists.txt。
你的 CMakeLists.txt
set_target_properties(WMCheckerTPass PROPERTIES
COMPILE_FLAGS "-fno-rtti"
)
您的 LLVM
工具链是在禁用 RTTI(默认)的情况下构建的,但是您的新模块启用了该功能,因此您需要复制 LLVM
构建设置,因为您的库将由 opt
并且您不应该生成当前不存在的符号(就像您的错误一样)。
或者,如果您 运行 在您的终端上这样做:
c++filt _ZTIN4llvm10ModulePassE
你会得到
typeinfo for llvm::ModulePass
这是一个明确的指示。
最好也复制 LLVM
的例外设置。
请参阅基本示例 CMake 文件 here。在 LLVM
安装中与 CMake 一起查看的关键文件是 LLVMConfig.cmake
.
可以找到相关文档here。