相关疑难解决方法(0)

CMake条件预处理器定义代码

我正在将一个makefile项目迁移到CMake.第一次编写makefile的人已经完成了一个用于在include文件中写入某些值的模块.

有一个主config.h文件,其中包含config_in.h.config.h文件包含以下内容:

#ifndef USE_FEATURE_A
#define USE_FEATURE_A 0
#endif

#ifndef USE_FEATURE_B
#define USE_FEATURE_B 0
#endif
Run Code Online (Sandbox Code Playgroud)

在makefile中有一个伪目标,就像with_feature_a在config_in.h中写的那样

#define USE_FEATURE_A 1
Run Code Online (Sandbox Code Playgroud)

通过这种方式,有人可以打字

make with_feature_a
make
Run Code Online (Sandbox Code Playgroud)

获得正确的构建.

我想使用这个代码库但使用CMake复制这样的东西.我在网上尝试了几种方法,但我没有让它发挥作用.

set_target_properties(with_feature_a PROPERTIES COMPILE_DEFINITIONS 
    "WITH_FEATURE_A=1"
)
Run Code Online (Sandbox Code Playgroud)

这不起作用,因为如果我跑

make with_feature_a
Run Code Online (Sandbox Code Playgroud)

我没有with_feature_a在预处理器命令行中看到.

我做的第二次尝试是直接用内容集写一个文件到我想要的东西,但我不明白如何将file()命令连接到我的目标.

我把它放在我的CMakeLists.txt中

file(WRITE 
local/config_in.h 
    "#define WITH_FEATURE_A 1"
)
Run Code Online (Sandbox Code Playgroud)

但这并不是每次都执行,我不知道如何将它设置为单个目标.

任何帮助表示赞赏.感谢您阅读所有这些内容.对不起长话:)

UPDATE

这里提供的解决方案是解决问题之路上的一大亮点.问题是不允许递归定义.我举了一个例子:

在CMakeLists.txt我放置:

if (WITH_FEATURE_A)
MESSAGE(STATUS "WITH_FEATURE_A")
add_definitions(-DUSE_FEATURE_A=1)
    add_definitions(-DWITH_FEABURE_B=1)
endif()

if (WITH_FEABURE_B)
MESSAGE(STATUS "WITH_FEATURE_B")
add_definitions(-DUSE_FEATURE_D=1)
endif()


if (WITH_FEABURE_C)
MESSAGE(STATUS "WITH_FEATURE_C")
add_definitions(-DUSE_FEATURE_D=1)
endif()


if (WITH_FEABURE_D)
MESSAGE(STATUS "WITH_FEATURE_D")
endif()
Run Code Online (Sandbox Code Playgroud)

在这种情况下,如果我用-DWITH_FEATURE_A = 1执行cmake,我很乐意在输出中看到: …

c preprocessor cmake

21
推荐指数
2
解决办法
3万
查看次数

标签 统计

c ×1

cmake ×1

preprocessor ×1