【问题标题】:How to add definition -DFOO with CMake?如何使用 CMake 添加定义 -DFOO?
【发布时间】:2017-08-24 08:29:23
【问题描述】:

我发现我可以使用:

add_definitions(-DFOO -DBAR ...)

很遗憾,这不是一个可移植的解决方案。如果我使用 gcc,它将理解 -D 开关,但如果我使用另一个编译器,它可能无法理解该开关。

是否有其他解决方案,例如

set(CMAKE_DEFINES ${CMAKE_DEFINES} FOO BAR)

【问题讨论】:

  • -D 是由 CMake 解析的,因此它是可移植的,应该适用于所有平台。您能否添加您可能遇到的任何错误消息?
  • 我收到了一条带有add_definitions("-std=c99") 的错误消息,它是gcc 特定的。 IAR 中有一个等价物,但 CMake 可能不知道它
  • 好的。不要将add_definitions() 用于任何其他编译器开关然后定义。 CMake 具有一些编译器开关的跨平台抽象/选项。您要搜索的内容定义在名为 CMAKE_C_STANDARD 的变量中。
  • 我不明白它是如何工作的。在函数add_definition 中,CMake 将解析和识别内容,并最终将其替换为诸如SHARC 编译器的--flags-linker -DFFOO 之类的内容,但它不知道如何解析-std=c99。我怎么知道我需要使用哪种方法?

标签: cmake


【解决方案1】:

如果set(CMAKE_C_STANDARD 99) 不适用于您的所有编译器,则使用通常的现代方式指定编译选项:

target_compile_options(mytarget PUBLIC -std=c99)

如果需要,您还可以为不同类型的编译器添加编译器检查。

或者,您可以直接修改编译器标志变量,例如set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c99"),再次进行可能的编译器检查。

如果由于某种原因您的编译器在没有特定选项的情况下甚至无法工作或生成成功的构建,那么请考虑指向包含变量 CMAKE_USER_MAKE_RULES_OVERRIDE 的文件,该变量包含每个构建/配置类型的初始编译器标志的 CMAKE_C_FLAGS_<CONFIG>_INIT 变量。

【讨论】:

  • 是的,还有第三种选择。 CMake 让我很困惑。我感到非常失落。这两天我试图寻找一个基本的例子,但没有任何效果:(
猜你喜欢
  • 2017-04-08
  • 2011-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-12
  • 2016-07-20
相关资源
最近更新 更多