直接传递编译选项(绕过 CMakeLists.txt)

Posted

技术标签:

【中文标题】直接传递编译选项(绕过 CMakeLists.txt)【英文标题】:Pass compile options directly (bypassing CMakeLists.txt) 【发布时间】:2018-09-26 03:52:07 【问题描述】:

给定代码

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

THEREcmakecmake -DMY_DEFINE=0?

【问题讨论】:

【参考方案1】:

您可以将configure_file 命令与#cmakedefine01 一起使用,如下所示:

configure.h.in的内容)

#cmakedefine01 MY_DEFINE

(在您的 CMakeLists.txt 中)

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

这将在您的构建目录中生成一个configure.h,并设置适当的#define。第二个例子见configure_file documentation。

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

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

【讨论】:

以上是关于直接传递编译选项(绕过 CMakeLists.txt)的主要内容,如果未能解决你的问题,请参考以下文章

传递编译器选项 cmake

c++ 编译器会绕过拷贝构造函数

抖音最新版抓包方案,修改so绕过ssl

如何修改传递给 ld 的选项,而不重新编译 gcc

java泛型的作用是在编译阶段防止错误输入,绕过编译就绕过泛型,可用反射验证

如何绕过将数据模型传递给片段参数以避免事务太大异常?