【发布时间】:2019-04-18 14:55:48
【问题描述】:
是否可以设置任何独立于编译器的标志?我希望能够将单个变量设置为例如OPTIMIZE_MOST 并在 gcc 上获得 -O3,在 MS C++ 编译器中获得 /O2。有什么我可以使用的,或者应该为每个编译器分别设置标志吗?
【问题讨论】:
标签: cmake
是否可以设置任何独立于编译器的标志?我希望能够将单个变量设置为例如OPTIMIZE_MOST 并在 gcc 上获得 -O3,在 MS C++ 编译器中获得 /O2。有什么我可以使用的,或者应该为每个编译器分别设置标志吗?
【问题讨论】:
标签: cmake
简单地说:不,没有标志可以直接为每个编译器独立设置优化级别。
但是,CMake 提供了所谓的build types。它们独立于使用的编译器,并且每个都带有预定义的标志选择,其中之一是优化标志。
可用的构建类型是
DebugReleaseRelWithDebInfoMinSizeRel全面的解释,我参考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}")
【讨论】:
在一定程度上。对于某些概念,CMake 支持以与编译器无关的方式指定它们,通常是通过在相关目标上设置属性。不幸的是,没有一个地方可以列出所有这些可能性。我浏览了当前的list of target properties,并将以下属性标识为“absrtacting away build-tool option syntax”:
COMPILE_PDB_NAMEINCLUDE_DIRECTORIESINSTALL_RPATHINTERPROCEDURAL_OPTIMIZATIONLINK_DIRECTORIESLINK_LIBRARIESPDB_NAMEPDB_OUTPUT_DIRECTORY除了 IPO 之外,显然没有任何东西可以处理优化标志。
据我所知,也没有添加这些的通用过程——它们被添加到 CMake 中,因为有人发现需要它们(以及实施它们的时间)。
【讨论】: