CMake和编译器警告

Evg*_*zin 22 gcc cmake

CMake用来生成unix makefile.之后,我使用make实用程序编译项目.问题是我看不到任何警告!例如,这会导致干净的构建而不会发出警告:

#include <iostream>

class Foo
{
    int first;
    int second;
public:
    Foo(int a, int b)
    : second(a) // invalid initialization order
    , first(b)
    {
    }
};

int main(int argc, char** argv)
{
    int unused; // unused variable
    int x;
    double y = 3.14159;
    x = y; // invalid cast
    Foo foo(1,2);
    std::cout << y << std::endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

未使用的变量和有损变量 - 没有警告!我的CMakeLists.txt档案很简约:

cmake_minimum_required(VERSION 2.8)

add_executable(main main.cpp)
Run Code Online (Sandbox Code Playgroud)

当我运行cmake然后make我的输出看起来像这样:

[100%] Building CXX object CMakeFiles/main.dir/main.cpp.o
Linking CXX executable main
[100%] Built target main
Run Code Online (Sandbox Code Playgroud)

但是当我添加这行代码时:

#warning ("Custom warning")
Run Code Online (Sandbox Code Playgroud)

结果输出包含警告:

[100%] Building CXX object CMakeFiles/main.dir/main.cpp.o
../src/main.cpp:15:2: warning: #warning ("Custom Warning") [-Wcpp]
Linking CXX executable main
[100%] Built target main
Run Code Online (Sandbox Code Playgroud)

我使用Ubuntu 12.04 LTS和GCC作为编译器.也许CMake将一些标志传递给编译器,导致没有警告.我怎么检查呢?我无法阅读CMake生成的makefile,它们有点神秘.

Dev*_*lar 29

编译器警告的位置是分开的.有包维护者会告诉你他们知道他们在做什么,并且在任何情况下都应该忽略编译器警告.(我认为他们错了.)但我猜这就是为什么CMake大多只留下警告设置的原因.

如果您想要更复杂一点,请检查正在使用的编译器,并将标志添加到特定目标的特定属性.

适用于单个目标

if ( CMAKE_COMPILER_IS_GNUCC )
    target_compile_options(main PRIVATE "-Wall -Wextra")
endif()
if ( MSVC )
    target_compile_options(main PRIVATE "/W4")
endif()
Run Code Online (Sandbox Code Playgroud)

适用于所有目标

if ( CMAKE_COMPILER_IS_GNUCC )
    set(CMAKE_CXX_FLAGS  "${CMAKE_CXX_FLAGS} -Wall -Wextra")
endif()
if ( MSVC )
    set(CMAKE_CXX_FLAGS  "${CMAKE_CXX_FLAGS} /W4")
endif()
Run Code Online (Sandbox Code Playgroud)

注意:为GCC添加-Werror或为MSVC添加/ WX以将所有警告视为错误.这会将所有警告视为错误.这对于新项目强制执行严格警告非常方便.

此外,-Werror并不意味着"所有错误"; 从历史上看,它意味着" 所有人都能达成共识的错误".开始/WX,然后仔细阅读了手册 GCC的版本,并查找其他的编译器可以为您提供关于警告做.

  • 一种现代方法是使用 [`add_compile_options`](https://cmake.org/cmake/help/latest/command/add_compile_options.html#example) (2认同)