繁体   English   中英

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文件。 与CMake一起在LLVM安装中查看的关键文件是LLVMConfig.cmake

相关文档可在此处找到。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM