基本上我有为测试源代码创建二进制文件的规则,还有为应用程序源代码创建二进制文件的规则。然后我有两个单独的规则来为每个规则生成可执行文件(每个链接到它们各自的库)。以下是为测试生成可执行文件的规则示例。如图所示,我添加了一个编译定义。我的问题是这个编译定义似乎没有递归地传递/可用到应用程序二进制文件规则(当从下面的规则调用时)。所以我在应用程序中有一些代码受“TESTS”保护,我希望只有在触发以下规则时才编译它。该代码也在头文件中受到保护。 有办法实现吗?
编辑: 为了更清楚,我希望在调用此规则时,将此编译定义添加到两个目标 OBJS 和 Tests_OBJS 的编译定义中。
add_executable(tests
$<TARGET_OBJECTS:Tests_OBJS>
$<TARGET_OBJECTS:OBJS>
Tests/Main.cpp)
target_link_libraries(tests ${LIBS})
target_compile_definitions(tests PRIVATE TESTS=1)
最佳答案
表达式 $<TARGET_OBJECTS>
指的不是来源,而是对象。更改源的编译定义已经晚了 - 它们在这个阶段已经编译。如果您需要为不同的目的以不同的方式编译一组源代码,您需要 add_library()
调用每种编译方式:
set(my_lib_sources ...)
# Set of objects for application
add_library(my_lib OBJECTS ${my_lib_sources})
# Set of objects for tests, they use special compile definitions
add_library(my_lib_test OBJECTS ${my_lib_sources})
target_compile_definitions(my_lib_test PRIVATE TESTS=1)
add_executable(tests
$<TARGET_OBJECTS:my_lib_test> # Already use special compile definitions
Tests/Main.cpp)
# Uncomment, if additional definitions are needed for Tests/Main.cpp
# target_compile_definitions(tests PRIVATE TESTS=1)
关于c++ - 如何在cmake中为目标添加递归编译定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35753738/