【问题标题】:CMake compiler independent flagsCMake 编译器独立标志
【发布时间】:2019-04-18 14:55:48
【问题描述】:

是否可以设置任何独立于编译器的标志?我希望能够将单个变量设置为例如OPTIMIZE_MOST 并在 gcc 上获得 -O3,在 MS C++ 编译器中获得 /O2。有什么我可以使用的,或者应该为每个编译器分别设置标志吗?

【问题讨论】:

    标签: cmake


    【解决方案1】:

    简单地说:不,没有标志可以直接为每个编译器独立设置优化级别。

    但是,CMake 提供了所谓的build types。它们独立于使用的编译器,并且每个都带有预定义的标志选择,其中之一是优化标志。

    可用的构建类型是

    • Debug
    • Release
    • RelWithDebInfo
    • MinSizeRel

    全面的解释,我参考this answer。当包含在CMakeLists.txt 文件中时,它还提供了一些有助于识别有问题的标志的代码:

    message("CMAKE_C_FLAGS_DEBUG is ${CMAKE_C_FLAGS_DEBUG}")
    message("CMAKE_C_FLAGS_RELEASE is ${CMAKE_C_FLAGS_RELEASE}")
    message("CMAKE_C_FLAGS_RELWITHDEBINFO is ${CMAKE_C_FLAGS_RELWITHDEBINFO}")
    message("CMAKE_C_FLAGS_MINSIZEREL is ${CMAKE_C_FLAGS_MINSIZEREL}")
    
    message("CMAKE_CXX_FLAGS_DEBUG is ${CMAKE_CXX_FLAGS_DEBUG}")
    message("CMAKE_CXX_FLAGS_RELEASE is ${CMAKE_CXX_FLAGS_RELEASE}")
    message("CMAKE_CXX_FLAGS_RELWITHDEBINFO is ${CMAKE_CXX_FLAGS_RELWITHDEBINFO}")
    message("CMAKE_CXX_FLAGS_MINSIZEREL is ${CMAKE_CXX_FLAGS_MINSIZEREL}")
    

    【讨论】:

      【解决方案2】:

      在一定程度上。对于某些概念,CMake 支持以与编译器无关的方式指定它们,通常是通过在相关目标上设置属性。不幸的是,没有一个地方可以列出所有这些可能性。我浏览了当前的list of target properties,并将以下属性标识为“absrtacting away build-tool option syntax”:

      • COMPILE_PDB_NAME
      • INCLUDE_DIRECTORIES
      • INSTALL_RPATH
      • INTERPROCEDURAL_OPTIMIZATION
      • LINK_DIRECTORIES
      • LINK_LIBRARIES
      • PDB_NAME
      • PDB_OUTPUT_DIRECTORY
      • (加上设置输出名称、路径等属性)

      除了 IPO 之外,显然没有任何东西可以处理优化标志。

      据我所知,也没有添加这些的通用过程——它们被添加到 CMake 中,因为有人发现需要它们(以及实施它们的时间)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多