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

时间:2016-03-02 17:07:55

标签: c++ cmake

基本上我有规则为测试源代码创建二进制文件,其他规则为应用程序源代码创建二进制文件。然后我有两个单独的规则来为每个规则生成可执行文件(每个都链接到它们各自的库)。以下是为测试生成可执行文件的规则示例。如图所示,我添加了一个编译定义。我的问题是这个编译定义似乎没有递归地传递/可用于应用程序二进制文件规则(当从下面的规则调用时)。所以我在应用程序中有一些代码由#34; TESTS"我希望只有在触发下面的规则时才能编译它。代码也在头文件中受到保护。 有没有办法实现这个目标?

编辑: 为了更清楚,我希望在调用此规则时,将此编译定义添加到两个目标OBJS和Tests_OBJS的编译定义中。

Field field = Activity.class.getDeclaredField("mActivityInfo");
field.setAccessible(true);
ActivityInfo value = (ActivityInfo) field.get(this);
Log.e("APPINFO2", "NAME: " + value.name);

1 个答案:

答案 0 :(得分: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)