【问题标题】:cmake override compile definitions from command linecmake 从命令行覆盖编译定义
【发布时间】:2021-03-12 14:31:30
【问题描述】:

我有一个带有cmake 的项目,我想设置一个编译定义,每次make 命令运行时用户都可以从命令行覆盖它,并将其设置为他们想要的任何内容。我希望这是一个字符串。

我尝试添加

add_compile_definitions(USER_DEFINITION)

然后运行make USER_DEFINITION="HELLO" VERBOSE=1

但我看到编译器忽略了我作为字符串的设置,它只是将它定义为布尔值。

arm-none-eabi-gcc -DUSER_DEFINITION

我试图省略add_compile_definition,但我得到error: 'USER_DEFINITION' undeclared

我有什么办法可以在cmake 中做到这一点? 我可以使用 cmake 参数,但我不想每次都重新配置 cmake。

【问题讨论】:

    标签: makefile cmake definition


    【解决方案1】:

    由于 Makefile 中的变量是用$(varname) 语法引用的,所以你可以写

    add_compile_definitions(USER_DEFINITION=$(USER_DEFINITION))
    

    这样,构建项目

    make USER_DEFINITION="HELLO"
    

    -DUSER_DEFINITION=HELLO 选项传递给编译器。

    但是请注意:

    1. 这是未记录的功能。它可以在当前的 CMake 版本中运行,并可能在未来的版本中中断。

    2. 更改变量的值不会强制重建可执行文件。 也就是说,如果您运行make USER_DEFINITION="HELLO",然后运行make USER_DEFINITION="GOODBAY",第二次调用将不会使用新的宏值重建可执行文件。您需要显式调用make cleanmake <path-to-object-file> 来重建可执行文件。

    3. 这仅适用于与 Makefile 相关的生成器(构建系统)。例如。为 Ninja 工作可能需要对变量的其他引用。

    【讨论】:

    • 它有效,谢谢!需要一些反斜杠。 make USER_DEFINITION=\\\"HELLO\\\"
    猜你喜欢
    • 1970-01-01
    • 2013-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-30
    相关资源
    最近更新 更多