CMAKE:如何在Cmakelists.txt中构建多个库

CMake: How to build multiple libraries within the CMakeLists.txt?

本文关键字:构建 txt Cmakelists CMAKE      更新时间:2023-10-16

使用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构建第二个库。

您需要在CMakeLists.txt

set_target_properties(WMCheckerTPass PROPERTIES COMPILE_FLAGS "-fno-rtti" )

您的LLVM工具链是使用禁用RTTI(默认值(构建的,但是您的新模块已启用,因此您需要复制LLVM构建设置,因为您的库将由opt加载,并且您不应生成当前的符号不存在(与您的错误一样(。

另外,如果您在终端上运行此操作:

c++filt _ZTIN4llvm10ModulePassE

您会得到

typeinfo for llvm::ModulePass

这是一个明显的指示。

也是一个好主意,也可以复制LLVM的设置以例外。请参阅此处的基本示例CMAKE文件。与CMAKE结合使用的LLVM安装中要查看的密钥文件是LLVMConfig.cmake

可以在此处找到相关文档。