我正在尝试使用接口库来定义预处理器宏。这些接口库随后将链接到其他库,以传播这些宏。这种方法适用于我正在创建的共享库,但不适用于CMake对象库。
我了解您不能直接将接口库链接到对象库,但是可以间接地将其链接TARGET_OBJECTS到接口库。
文件:
尽管对象库可能无法在
target_link_libraries()命令调用中直接命名,但是可以使用INTERFACE_SOURCES目标属性设置为name 的接口库间接“链接”它们$<TARGET_OBJECTS:objlib>。
我尝试这样做,但是目标文件仍未使用适当的定义进行编译。这是最小的工作示例:
// a.cpp
int a() {
return
#ifdef MY_DEF
5;
#endif
}
Run Code Online (Sandbox Code Playgroud)
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)
Run Code Online (Sandbox Code Playgroud)
输出:
/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]: *** …Run Code Online (Sandbox Code Playgroud) cmake ×1