【发布时间】:2017-06-26 19:15:58
【问题描述】:
我正在尝试使用接口库来定义预处理器宏。然后将这些接口库链接到其他库以传播这些宏。这种方法适用于我正在创建的共享库,但不适用于 CMake 对象库。
我了解您不能直接将接口库链接到对象库,但您可以将TARGET_OBJECTS 间接链接到接口库。
Docs:
虽然对象库不能在调用
target_link_libraries()命令时直接命名,但可以通过使用将INTERFACE_SOURCES目标属性设置为名称$<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 合并请求得到支持。对于旧版本,乌托邦的答案是要走的路。
【问题讨论】:
-
target_link_libraries(main_lib)应该是target_link_libraries(main_lib interface_lib)。 -
我认为只有在我想将定义应用于
main_lib目标的源时才有必要这样做。因为object_lib源文件是单独编译的,所以定义不适用于它。尽管如此,我尝试了tll(main_lib interface_lib),但它没有将定义应用于 object_lib 源。 -
在任何情况下,带有单个参数的
target_link_libraries无用。嗯,根据错误日志,您正在编译object_lib中的目标文件。如果你想让这个文件有特定的定义,你需要链接object_lib目标,而不是main_lib一个:target_link_libraries(object_lib interface_lib)。将 OBJECT 库视为一组 预编译 目标文件:main_lib为这些文件分配 compile 选项为时已晚。跨度> -
@Tsyvarev 是的。这就是为什么我没有将它包含在
target_link_libraries电话中。我想将定义应用于目标文件,并且(至少根据我链接的文档)这应该可以通过将object_lib的TARGET_OBJECTS添加到接口库中,就像我在target_sources命令中所做的那样
标签: cmake