gpt4 book ai didi

cmake - 将 CMake 接口(interface)库与对象库链接

转载 作者:行者123 更新时间:2023-12-03 15:38:30 26 4
gpt4 key购买 nike

我正在尝试使用接口(interface)库来定义预处理器宏。然后将这些接口(interface)库链接到其他库以传播这些宏。这种方法适用于我正在创建的共享库,但不适用于 CMake 对象库。

我知道您不能直接将接口(interface)库链接到对象库,但可以间接链接 TARGET_OBJECTS到接口(interface)库。

Docs :

Although object libraries may not be named directly in calls to the target_link_libraries() command, they can be “linked” indirectly by using an Interface Library whose INTERFACE_SOURCES target property is set to name $<TARGET_OBJECTS:objlib>.



我曾尝试这样做,但目标文件仍未使用适当的定义进行编译。这是最小的工作示例:

// a.cpp    
int a() {
return
#ifdef MY_DEF
5;
#endif
}

CMakeLists:

cmake_minimum_required(VERSION 3.0.1)
project(my_question)

add_library(object_lib OBJECT a.cpp)

add_library(interface_lib INTERFACE)
target_compile_definitions(interface_lib INTERFACE MY_DEF)

# This does not set the MY_DEF flag
target_sources(interface_lib INTERFACE $<TARGET_OBJECTS:object_lib>)

add_library(main_lib SHARED $<TARGET_OBJECTS:object_lib>)
target_link_libraries(main_lib)

输出:
/Library/Developer/CommandLineTools/usr/bin/make -f CMakeFiles/object_lib.dir/build.make CMakeFiles/object_lib.dir/build
[ 50%] Building CXX object CMakeFiles/object_lib.dir/a.cpp.o
/Library/Developer/CommandLineTools/usr/bin/c++ -o CMakeFiles/object_lib.dir/a.cpp.o -c /Users/umar/devel/so_question/a.cpp
/Users/umar/devel/so_question/a.cpp:7:5: error: expected expression
}
^
1 error generated.
make[2]: *** [CMakeFiles/object_lib.dir/a.cpp.o] Error 1
make[1]: *** [CMakeFiles/object_lib.dir/all] Error 2
make: *** [all] Error 2

根据文档,这在 CMake 中应该是可能的。我不确定我是否做错了什么,或者这是否是 CMake 中的问题。我已经能够在 Debian 和 OSX 上的 CMake 版本 3.6 和 3.8 中重现这一点。

编辑:

我已经能够使用@utopia 的方法解决这个问题,但我很好奇为什么我在示例中使用的方法不起作用。我不知道我是否做错了,或者这是否是工具的问题。也许 StackOverflow 不是此类问题的正确平台,我应该针对该项目提交错误报告。

编辑2:

在 CMake(3.8) 的最新版本中,这在 CMake( see discussion) 中是不可能的。这可能在 3.9 中通过 this 得到支持。合并请求。对于旧版本,乌托邦的答案是要走的路。

最佳答案

从 cmake 3.13 开始,对象库可以“链接”到其他库以继承它们的使用要求 (doc)。

因此,问题中的示例 CMakeLists.txt 应该在编译时获得正确的定义。

如果您使用它,请不要忘记设置 cmake_required(VERSION 3.13)!

关于cmake - 将 CMake 接口(interface)库与对象库链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44767099/

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