gpt4 book ai didi

c++ - CMake:如何在 CMakeLists.txt 中构建多个库?

转载 作者:行者123 更新时间:2023-11-30 03:32:13 26 4
gpt4 key购买 nike

使用 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 属性
COMPILE_FLAGS “-fno-rtti”
)

你的 LLVM 工具链是在禁用 RTTI(默认)的情况下构建的,但是你的新模块启用了它,所以你需要复制 LLVM build设置,因为你的库将由 opt 加载,你不应该生成当前不存在的符号(就像你的错误一样)。

或者,如果您在终端上运行它:

c++filt _ZTIN4llvm10ModulePassE

你会得到

llvm::ModulePass 的类型信息

这是一个明确的指示。

最好也复制 LLVM 的异常设置。查看基本示例 CMake 文件 here .在与 CMake 一起安装的 LLVM 中要查看的关键文件是 LLVMConfig.cmake

可以找到相关文档here .

关于c++ - CMake:如何在 CMakeLists.txt 中构建多个库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43630294/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com