我使用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,它们有点神秘。
答案 0 :(得分:26)
编译器警告的位置是分开的。有包维护者会告诉你他们知道他们在做什么,并且在任何情况下都应该忽略编译器警告。 (我认为他们错了。)但我想这就是为什么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()
注意:为GCC添加-Werror
或为MSVC添加/WX
以将所有警告视为错误。这会将所有警告视为错误。这对于强制严格警告的新项目来说非常方便。
此外,-Wall -Wextra
并不代表“所有错误”;历史上-Wall
意味着“所有错误每个人都可以同意”,而-Wextra
“更多”。从那开始,然后仔细阅读你的版本的GCC手册,找到编译器可以为你做的关于警告的 else ...
答案 1 :(得分:-5)
解决这行代码的问题:
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