gpt4 book ai didi

gcc - CMake 和编译器警告

转载 作者:行者123 更新时间:2023-12-03 01:04:49 30 4
gpt4 key购买 nike

我使用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,它们有点神秘。

最佳答案

关于编译器警告的立场是有分歧的。有些软件包维护者会告诉您他们知道自己在做什么,并且在任何情况下都应该忽略编译器警告。 (我认为他们大错特错了。)但我想这就是为什么 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 版本的手册,并找到编译器在警告方面可以为您做的其他...

关于gcc - CMake 和编译器警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14231292/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com