CMake和编译器警告(CMake and compiler warnings)

2019-07-18 00:41发布

我用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;
}

未使用的变量和有损可变投 - 任何警告! 我CMakeLists.txt文件是简约:

cmake_minimum_required(VERSION 2.8)

add_executable(main main.cpp)

当我运行cmake ,然后make我看起来就像这样:

[100%] Building CXX object CMakeFiles/main.dir/main.cpp.o
Linking CXX executable main
[100%] Built target main

但是,当我加入这行代码:

#warning ("Custom warning")

输出结果中包含的警告:

[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

我使用Ubuntu 12.04 LTS和GCC作为编译器。 也许CMake的通过一些标志编译导致没有警告。 如何检查呢? 我无法读取的CMake生成的makefile,他们是有点神秘。

Answer 1:

对编译器警告的立场分歧。 有包维护者谁都会告诉你,他们知道自己在做什么,以及编译器警告无论如何应被忽略。 (我认为他们不能更错了。)不过,我想这就是为什么CMake的大多是独自离开的警告设置。

如果你想更复杂的关于它的位,检查所使用的编译器和标志添加到特定目标的特定属性。

适用于单个目标

if ( CMAKE_COMPILER_IS_GNUCC )
    target_compile_options(main PRIVATE "-Wall -Wextra")
endif()
if ( MSVC )
    target_compile_options(main PRIVATE "/W4")
endif()

应用于所有目标

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()

注:添加-Werror为GCC或/WX的MSVC把所有的警告视为错误。 这将所有警告视为错误。 这是很方便的新项目,以加强预警严格。

此外, -Wall -Wextra并不意味着“所有的错误”; 历史上-Wall意味着“所有错误,每个人都可以达成一致 ”,并-Wextra “更多”。 与开始,然后细读你的 GCC的版本的手册,并找到其他什么编译器可以为您提供关于警告做...



Answer 2:

与这行代码解决问题:

add_definitions ("-Wall")

结果现在看起来是这样的:

[100%] Building CXX object CMakeFiles/main.dir/main.cpp.o
../src/main.cpp:15:2: warning: #warning ("Custom warning") [-Wcpp]
../src/main.cpp: In constructor ‘WarnSrc::WarnSrc(int, int)’:
../src/main.cpp:6:9: warning: ‘WarnSrc::second’ will be initialized after [-Wreorder]
../src/main.cpp:5:9: warning:   ‘int WarnSrc::first’ [-Wreorder]
../src/main.cpp:8:5: warning:   when initialized here [-Wreorder]
../src/main.cpp: In function ‘int main(int, char**)’:
../src/main.cpp:19:9: warning: unused variable ‘unused’ [-Wunused-variable]
../src/main.cpp:20:9: warning: variable ‘x’ set but not used [-Wunused-but-set-variable]
Linking CXX executable main
[100%] Built target main


文章来源: CMake and compiler warnings
标签: gcc cmake