【发布时间】:2018-02-10 06:08:26
【问题描述】:
Visual Studio 2017 带有完整的 CMake 集成。为了了解这种组合,我从这个基本示例开始:
# CMakeLists.txt
cmake_minimum_required(VERSION 3.8)
project(foo)
add_executable(foo foo.cpp)
和
// foo.cpp
int main() {}
这会正确生成构建脚本,并且可以毫无问题地编译和链接。这很容易。
另一方面,尝试设置编译器选项却并非易事。就我而言,我试图将警告级别设置为 4。
显而易见的解决方案
add_compile_options("/W4")
没有像预期的那样成功。传递给编译器的命令行现在包含/W4(如预期)和/W3(从其他地方获取),产生以下警告:
cl : Command line warning D9025: overriding '/W3' with '/W4'
要解决这个问题,我需要替换任何不兼容的编译器选项,而不仅仅是添加一个。 CMake 没有为此提供任何即时支持,标准解决方案(如this Q&A suggests)似乎是:
if(CMAKE_CXX_FLAGS MATCHES "/W[0-4]")
string(REGEX REPLACE "/W[0-4]" "/W4" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
else()
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W4")
endif()
然而,这有两个问题:
- 它设置全局
CMAKE_CXX_FLAGS,适用于所有C++目标。这可能不是故意的(现在对我来说不是问题)。 - 它无法扩展。对于要添加的每个编译器选项,您都必须阅读不兼容的选项,然后先手动删除这些选项。这将不可避免地失败1。
我的问题有两个:
- CMake 集成从哪里获取默认设置,是否可以控制?
- 一般如何设置编译器选项? (如果这个话题过于宽泛,我很乐意仅在设置警告级别方面提供帮助。)
1顺便说一句,我复制的解决方案无法解释
/Wall 选项,这也与 /W4 不兼容。
【问题讨论】:
-
@Florian:感谢您的确认,CMake 不直接支持设置警告级别。不过,您发布的链接对我并没有立即帮助:Ruslo 的作品仅支持设置
/Wall,而第二个链接通过调整CMAKE_CXX_FLAGS来工作。 @sakra 发布的用于覆盖默认编译器选项的 answer 看起来像是一个更简洁的解决方案,允许对设置编译器选项进行更细粒度的控制。 -
当我为this question 工作时,我注意到
add_compile_options()命令确实替换/覆盖了警告级别规范,而不是像附加到@ 时那样仅将其附加到“附加选项”中987654339@。我不确定为什么会有区别(必须检查 CMake 的代码),但可以试试add_compile_options("/W4")吗?在我的 CMake 3.9 版中,我不再收到该编译器警告。 -
@Florian:
add_compile_options("/W4")仍然给我一个编译器警告。我正在使用"Ninja"生成器,使用 Visual Studio 2017 (15.3.3) 中内置的 CMake 支持,因此沿途没有生成 .vcxproj(据我所知)。这是使用cmake version 3.8.0-MSVC_2。
标签: visual-c++ cmake visual-studio-2017