我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的版本,并查找其他的编译器可以为您提供关于警告做.