c++ - 如何在cmake中为目标添加递归编译定义

标签 c++ cmake

基本上我有为测试源代码创建二进制文件的规则,还有为应用程序源代码创建二进制文件的规则。然后我有两个单独的规则来为每个规则生成可执行文件(每个链接到它们各自的库)。以下是为测试生成可执行文件的规则示例。如图所示,我添加了一个编译定义。我的问题是这个编译定义似乎没有递归地传递/可用到应用程序二进制文件规则(当从下面的规则调用时)。所以我在应用程序中有一些代码受“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/

相关文章:

cmake - 使用自定义生成器扩展 CMake?

c++ - 用CMake生成自定义头文件

c++ - 如何将比较器 a-la std::less 传递给 C 风格的 Qsort?

c++ - Qt 信号/槽不起作用 [非常基本]

c++ - 从基类继承 operator new

c++ - 防止 const 类函数在引用成员上调用非 const 类函数

c++ - #include - XCode 中的括号与引号?

c++ - CMake 添加库

gcc - 如何给CMake编译器添加前缀?

c++ - 链接静态库时Cmake链接路径错误