C语言-Werror=sign-compare编译错误解决方案
Posted coffee tea or me
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言-Werror=sign-compare编译错误解决方案相关的知识,希望对你有一定的参考价值。
在做C语言的一个小测试时,写了下面的一段代码,涉及到有符号数和无符号数的大小比较。
// automatic type conversion
if (-1L < 1U)
printf("sizeof(unsigned int)=%lu\\nsizeof(signed long int)=%lu\\n",
sizeof(unsigned int), sizeof(signed long int));
printf("\\\'-1L<1U\\\' since unsigned int is promoted to signed long type!\\n");
if (-1L > 1UL)
printf("sizeof(signed long int)=%lu\\nsizeof(unsigned long int)=%lu\\n",
sizeof(signed long int), sizeof(unsigned long int));
printf("\\\'-1L>1UL\\\' since signed long int is promoted to unsigned type!\\n");
然后使用CMake编译时显示错误
/home/cv/playground_test/src/playground.cc:185:10: In function‘int main(int, const char**)’:
error: comparison between signed and unsigned integer expressions [-Werror=sign-compare]
if (-1L > 1UL)
~~~~^~~~~
cc1plus: all warnings being treated as errors
CMakeFiles/playground.dir/build.make:62: recipe for target \'CMakeFile
s/playground.dir/src/playground.c.o\' failed
有符号数与无符号数的比较,虽然有时确实需要特别注意,但也不至于上来就Fatal Error
,尤其当我们明确需要这样操作时。
-Werror
是gcc/g++的配置参数,执行严格的错误检查,这里显然是把一般的警告也作为错误对待了,在CMakeLists中将其去掉即可。
选项 | 说明 |
---|---|
-Wall | 打开一些必要的警告选项,建议编译时加此选项。 |
-Werror | 视警告为错误,出现任何警告即放弃编译。 |
-Wextra | 打印一些额外的警告信息。 |
-w | 禁止显示所有警告信息。 |
把如下展示的第11行
set(CMAKE_CXX_FLAGS "$CMAKE_CXX_FLAGS -Wall -Werror")
替换成
set(CMAKE_CXX_FLAGS "$CMAKE_CXX_FLAGS -Wall")
然后重新编译就不会报错了。
修改后的CMakeLists.txt
文件内容如下
01 cmake_minimum_required(VERSION 3.0 FATAL_ERROR)
02 project(playground)
03
04 #====================================================
05 ## C++ compiler options
06 #====================================================
07 set(CMAKE_CXX_STANDARD 11)
08 set(CMAKE_CXX_EXTENSIONS OFF)
09 set(CMAKE_CXX_STANDARD_REQUIRED ON)
10 set(CMAKE_C_FLAGS "$CMAKE_C_FLAGS -std=c99 -Wall")
11 #set(CMAKE_CXX_FLAGS "$CMAKE_CXX_FLAGS -Wall -Werror")
12 set(CMAKE_CXX_FLAGS "$CMAKE_CXX_FLAGS -Wall")
13
14 set(CMAKE_BUILD_TYPE RELEASE)
15 # Set output directory to store executables, create if not exist
16 set(CMAKE_RUNTIME_OUTPUT_DIRECTORY $CMAKE_CURRENT_SOURCE_DIR/bin)
17
18 ## Search for source files
19 set(SRC_DIR $CMAKE_CURRENT_SOURCE_DIR/src)
20 file(GLOB_RECURSE SRC_LIST "$SRC_DIR/[^.]*.c*")
21
22 #====================================================
23 ## Compile target executables
24 #====================================================
25 foreach(src $SRC_LIST)
26 string(REGEX REPLACE ".+/(.+)\\\\..*" "\\\\1" SRC_FILE_NAME $src)
27 add_executable($SRC_FILE_NAME $src)
28 set_target_properties($SRC_FILE_NAME PROPERTIES LINKER_LANGUAGE CXX)
29 target_link_libraries($SRC_FILE_NAME pthread)
30 endforeach(src $SRC_LIST)
工程目录结构和运行主机配置如下。
# Project tree structure
.
├── CMakeLists.txt
├── bin
│ └── playground
├── build
└── src
└── playground.c
# Linux Ubuntu system information
cv@cv:~$ uname -a
Linux cv 4.18.0-25-generic #26~18.04.1-Ubuntu SMP Thu Jun 27 07:28:31 UTC 2019
x86_64 x86_64 x86_64 GNU/Linux
cv@cv:~$ g++ --version
g++ (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0
Copyright (C) 2017 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
cv@cv:~$ cmake --version
cmake version 3.10.2
CMake suite maintained and supported by Kitware (kitware.com/cmake)
cv@cv:~$ make --version
GNU Make 4.1
Built for x86_64-pc-linux-gnu
Copyright (C) 1988-2014 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
这里只是摘出相关的部分进行记录和说明,完整测试代码及环境要求详见 https://github.com/philleer/leetcode_test/tree/dev 。
(全文完)
本文作者 :phillee
发表日期 :2022年01月16日
本文链接 :https://www.cnblogs.com/phillee/p/15810793.html
版权声明 :自由转载-非商用-非衍生-保持署名(创意共享3.0许可协议/CC BY-NC-SA 3.0)。转载请注明出处!
限于本人水平,如果文章和代码有表述不当之处,还请不吝赐教。
以上是关于C语言-Werror=sign-compare编译错误解决方案的主要内容,如果未能解决你的问题,请参考以下文章
CMake基础教程(17)add_compile_options添加编译选项(-g -Werror)
nginx编译下出现error: this statement may fall through [-Werror=implicit-fallthrough=]