首页 > 解决方案 > 直接传递编译选项(绕过 CMakeLists.txt)

问题描述

给定代码

int main(int argc, char** argv)
{
#ifdef MY_DEFINE
    printf("HERE\n");
#else
    printf("THERE\n");
#endif
}

要切换HERE THERE行为,我的 `CMakeLists.txt 中需要以下内容

IF (${MY_DEFINE} MATCHES 1) # I want to remove these lines
    add_compile_options(-DMY_DEFINE)
ENDIF(${MY_DEFINE} MATCHES 1) # Up to here

那么,我可以

cmake -DMY_DEFINE=1要得到HERE

cmake -DMY_DEFINE=0要得到THERE

这一切似乎有点多余......是否可以删除我的 CMakeLists.txt 中的那几行并且仍然能够得到

HERE有类似的东西cmake -DMY_DEFINE=1

THERE只是cmakecmake -DMY_DEFINE=0

标签: c++ccmake

解决方案


您可以像这样使用该configure_file命令#cmakedefine01

(内容configure.h.in

#cmakedefine01 MY_DEFINE

(在你的 CMakeLists.txt 中)

configure_file(configure.h.in configure.h @ONLY)

这将configure.h在您的构建目录中生成一个具有适当#define设置的目录。有关第二个示例,请参见configure_file 文档

您还可以使用 CMakeoption命令公开可用选项。在你的情况下,那将是:

option(MY_DEFINE "This configures whether you print HERE or THERE" OFF)

推荐阅读