我正在使用 CMake(在 CLion IDE 中,但这对于本次讨论来说并不重要)。到目前为止,我一直在使用诸如set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O2")或 之类的东西set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O2")来设置 GCC 的编译器选项。我假设 CMake 将这些直接传递给编译器。然而,CMake 应该是独立于平台的,并且(至少原则上)能够使用不同的编译器构建相同的代码。这是否意味着人们应该采取不同的做法?
我一直在考虑使用构建配置。例如,我假设使用构建类型标志调用 CMake:
cmake .. -DCMAKE_BUILD_TYPE="Release"
启用一些优化。然而,我无法找到任何有关此标志到底有何作用的文档(可能是因为它取决于所使用的编译器等内容)。我有两个问题:
读取 CMake 生成的 makefile 来查找标志对我来说似乎不是一个选择。我尝试设置VERBOSE=yesMake 但不知何故它没有给我编译器标志,只是一些“进入结束退出目录”。
- -DCMAKE_BUILD_TYPE="Release" (和其他发布类型)的作用是什么(正如人们在不知道构建发生的系统的情况下所知道的那样)?
它启用核心 CMake 模块中定义的某些编译器选项,这些选项特定于目标系统。该文档没有准确解释每种构建类型的含义,但这些名称相当常用。我明白Release的意思是“禁用调试,启用最高优化”。
例如,该模块Modules/Compiler/GNU.cmake包含以下内容:
Run Code Online (Sandbox Code Playgroud)string(APPEND CMAKE_${lang}_FLAGS_RELEASE_INIT " -O3 -DNDEBUG")
- 查看编译器和构建时实际使用的所有选项的最佳方法是什么(在命令行中和在 CLion 等 IDE 中使用 CMake)?
一种方便的方法是编译数据库。格式在此处指定,并通过选项启用CMAKE_EXPORT_COMPILE_COMMANDS。然后,该文件 compile_commands.json将包含用于编译每个文件的确切命令。
/usr/bin/c++如果使用别名,弄清楚编译器可能需要额外的步骤,这很常见。
PS 在许多情况下,在发布模式下启用调试可能很有用。虽然RELWITHDEBINFO这样做,但它并不能实现最高的优化(-O2使用 GCC)。因此,我个人认为缺乏默认选择。