【问题标题】:Passing compiler command line to preprocessor using CMake使用 CMake 将编译器命令行传递给预处理器
【发布时间】:2012-06-26 09:23:48
【问题描述】:

我有一个 CMake 项目,我希望能够使用 g++、MinGW/g++(各 4.x)、Clang (3.x) 和 MSVC++ (>= V8) 进行编译。

我想要一个带有编译器参数或命令行的预编译器符号。

这对于查看是否启用了优化以及在命令行中启用了哪些开关很有用。

例如用g++ -O3 -DNDEBUG -g0 编译的程序应该知道标志是"-O3 -DNDEBUG -g0"。 在编写手动 Makefile 时,我可以简单地将标志收集到一个变量中,然后另外将其传递给编译器,生成一个命令行 g++ -O3 -DNDEBUG -g0 -DCOMPILER_ARGS="-O3 -DNDEBUG -g0"

如何使用 CMake 实现这一点?

【问题讨论】:

    标签: compiler-construction cmake c-preprocessor


    【解决方案1】:

    add_definitions("-DCOMPILER_ARGS=\"${CMAKE_CXX_FLAGS}\")

    但请注意,CMAKE_CXX_FLAGS 变量仅包含用户设置的标志。如果您想要整套编译标志,请使用目标属性COMPILE_FLAGS。这个值可以通过get_target_property()函数获取。

    【讨论】:

    • -1 CMAKE_CXX_FLAGS 在 Windows 上默认不为空。这也错过了配置特定变量中的所有标志,如CMAKE_CXX_FLAGS_DEBUG
    • 好吧,我没说它在 windows 上是空的。我说COMPILE_FLAGS 拥有所有标志。无论如何,感谢-1,现在我的声誉是圆的。
    • 您说“CMAKE_CXX_FLAGS 变量仅包含用户设置的标志”。情况并非总是如此。
    • 我认为目标 COMPILE_FLAGS 属性也没有所有标志。我的代表给了你一个-1,我得到了一个-1,所以它几乎是一样的:-)
    【解决方案2】:

    对于除 MSVC 之外的所有选项,您应该在构建或添加时只使用 make VERBOSE=1,而不是创建预处理器定义

    set(CMAKE_VERBOSE_MAKEFILE ON)
    

    到您的 CMakeLists.txt。

    对于 MSVC,您可以在 IDE 中检查每个项目的命令行参数:属性页 -> 配置属性 -> C/C++ -> 命令行和属性页 -> 配置属性 -> 链接器 -> 命令行。

    【讨论】:

    • @Manuel 需要一种将编译标志传递给程序的方法,如果我理解正确的话。你建议他手动复制粘贴?
    • 好吧,我建议将项目中的命令参数作为预处理器定义保存是非常不正统的。
    猜你喜欢
    • 2011-11-01
    • 1970-01-01
    • 2018-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-10
    • 2012-03-27
    相关资源
    最近更新 更多