常见gcc编译警告
c语言常见编译错误提示
c语言常见编译错误提示1) error C2001: newline in constant编号:C2001直译:在常量中出现了换行。
错误分析:1.字符串常量、字符常量中是否有换行。
2.在这句语句中,某个字符串常量的尾部是否漏掉了双引号。
3.在这语句中,某个字符创常量中是否出现了双引号字符“"”,但是没有使用转义符“\"”。
4.在这句语句中,某个字符常量的尾部是否漏掉了单引号。
5.是否在某句语句的尾部,或语句的中间误输入了一个单引号或双引号。
2) error C2015: too many characters in constant编号:C2015直译:字符常量中的字符太多了。
错误分析:单引号表示字符型常量。
一般的,单引号中必须有且只能有一个字符(使用转义符时,转义符所表示的字符当作一个字符看待),如果单引号中的字符数多于4个,就会引发这个错误。
另外,如果语句中某个字符常量缺少右边的单引号,也会引发这个错误,例如:i f (x == 'x || x == 'y') { … }值得注意的是,如果单引号中的字符数是2-4个,编译不报错,输出结果是这几个字母的ASC码作为一个整数(int,4B)整体看待的数字。
3) error C2137: empty character constant编号:C2137直译:空的字符定义。
错误分析:原因是连用了两个单引号,而中间没有任何字符,这是不允许的。
4) error C2018: unknown character '0x##'编号:C2018直译:未知字符‘0x##’。
错误分析:0x##是字符ASC码的16进制表示法。
这里说的未知字符,通常是指全角符号、字母、数字,或者直接输入了汉字。
如果全角字符和汉字用双引号包含起来,则成为字符串常量的一部分,是不会引发这个错误的。
5) error C2041: illegal digit '#' for base '8'编号:C2141直译:在八进制中出现了非法的数字‘#’(这个数字#通常是8或者9)。
gcc警告手册
gcc警告手册GCC(GNU Compiler Collection)是一款开源的编译器,用于将源代码编译成可执行文件。
在使用GCC编译代码时,可能会遇到各种警告信息,这些警告信息可以帮助我们发现代码中的潜在问题。
下面是一个关于GCC警告信息的800字左右的说明手册:一、概述GCC在编译过程中会输出警告信息,这些信息通常用于指出代码中可能存在的问题,如未使用的变量、未初始化的变量、潜在的类型不匹配等。
正确理解和处理这些警告信息可以帮助我们提高代码质量,减少潜在的错误和缺陷。
二、常见警告类型1.未使用的变量:当一个变量在定义后从未被使用时,GCC会发出这种警告。
这可能是由于变量名拼写错误、逻辑错误或者变量定义多余。
2.未初始化的变量:当一个变量在使用前未被初始化时,GCC会发出这种警告。
未初始化的变量可能导致不确定的行为,因此应该避免使用未初始化的变量。
3.潜在的类型不匹配:当一个变量的类型与其被赋予的值不匹配时,GCC会发出这种警告。
这可能是由于类型转换错误、函数返回值类型不匹配等原因引起的。
4.函数未声明:当一个函数在调用前未被声明时,GCC 会发出这种警告。
应该确保所有调用的函数都已在调用前声明或定义。
5.数组越界:当数组下标越界时,GCC会发出这种警告。
这可能是由于数组下标计算错误或者逻辑错误引起的。
6.除以零:当一个整数被零除时,GCC会发出这种警告。
应该避免整数被零除的情况。
7.丢失符号:当链接器找不到某个符号(如函数或变量)的定义时,GCC会发出这种警告。
这可能是由于编译选项错误、遗漏了某个源文件等原因引起的。
三、处理警告的方法1.检查代码逻辑:对于未使用的变量和未初始化的变量等警告,需要检查代码逻辑是否正确,确保每个变量都有正确的用途和初始化。
2.类型转换:对于潜在的类型不匹配等警告,可以使用类型转换来确保数据类型匹配。
3.函数声明:对于函数未声明等警告,需要确保所有调用的函数都已在调用前声明或定义。
常见gcc编译警告整理以及解决方法【收藏】
常见gcc编译警告整理以及解决方法【收藏】
1、warning: no newline at end of file
在文件最后一行加上回车键
解释:在《Rationale for the C99 standard》一文中,有C99的相关信息:
A backslash immediately before a newline has long been used to continue string literals, as well as preprocessing command lines. In the interest of easing machine generation of C, and of transporting code to machines with restrictive physical line lengths, the C89 Committee generalized this mechanism to permit any token to be continued by interposing a backslash/newline sequence.
c/c++代码的每一行后面有一个结束符,也就是newline。
避免当被include
的文件展开后,前一个文件的最后一行与后一个文件的第一行直接被连接成一行从而造成错误。
2、warning: comparison between pointer and integer
解释:integer与pointer比较
3、warning: assignment discards qualifiers from pointer target type。
GCC(警告.优化以及调试选项)
GCC(警告.优化以及调试选项)[介绍]gcc and g 分别是gnu的c & c 编译器gcc/g 在执行编译工作的时候,总共需要4步1.预处理,生成.i的文件预处理器cpp2.将预处理后的文件不转换成汇编语言,生成文件.s编译器egcs3.有汇编变为目标代码(机器代码)生成.o的文件汇编器as4.连接目标代码,生成可执行程序连接器ld1.总体选项-E只激活预处理,这个不生成文件,你需要把它重定向到一个输出文件里面.例子用法:gcc -E hello.c > pianoapan.txtgcc -E hello.c | more慢慢看吧,一个hello word 也要与处理成800行的代码-S只激活预处理和编译,就是指把文件编译成为汇编代码。
例子用法gcc -S hello.c他将生成.s的汇编代码,你可以用文本编辑器察看-c只激活预处理,编译,和汇编,也就是他只把程序做成obj文件例子用法:gcc -c hello.c他将生成.o的obj文件2.目录选项-Idir在你是用#include'file'的时候,gcc/g 会先在当前目录查找你所制定的头文件,如果没有找到,他回到缺省的头文件目录找,如果使用-I制定了目录,他回先在你所制定的目录查找,然后再按常规的顺序去找.对于#include,gcc/g 会到-I制定的目录查找,查找不到,然后将到系统的缺省的头文件目录查找-include file-i相当于“#include”包含某个代码,简单来说,就是便以某个文件,需要另一个文件的时候,就可以用它设定,功能就相当于在代码中使用#include例子用法:gcc hello.c -include /root/pianopan.h-I-就是取消前一个参数的功能,所以一般在-Idir之后使用-idirafter dir在-I的目录里面查找失败,讲到这个目录里面查找.-iprefix prefix-iwithprefix dir一般一起使用,当-I的目录查找失败,会到prefix dir下查找-Ldir制定编译的时候,搜索库的路径。
对于GCC警告选项的理解
dereferencing type-punned pointer will break strict-aliasing rules 警告信息跟 优化选项-fstrict-aliasing 有关。当开启这个优化选项时,可能优化会导致源 代码中部分语句缺失,而造成系统工作不正常,所以就所有的违反 strictaliasing rules 原则的地方加了条这个警告信息,提醒读者检查这个地方的代 码,看看是不是如果优化后会导致部分语句工作不正常 同时这个信息提示还有另外一个目的,两个不同类型的指针指向同一个地 址时,极有可能会导致代码编写出错(比如犯大小端的错误,还有地址字节对 齐的错误),所以这个警告信息还有这一层的目的。
3 ../SRC/libpjmacl/pjmacl_pjm.c:2867: 警告: no previous declaration for pjmacl_get_node_pri_U pjmacl_get_node_pri_U 如果为外部函数的话,就应该有个声明加到类似 pjsd_prt.h 中 4 ../SRC/libpjmfep/pjmfep_exec.c:406: 警告: implicit declaration of function pj/libpjmfep/pjmfep_exec.c:406: 警告: nested extern declaration of pjmfep_evc_queue_init pjmfep_evc_queue_init 函数就没有被声明过,而且如果定义文件和引用该 函数文件不一样时,引用该函数的文件也没有提前用 extern 声明该函数 5 ../SRC/pjmd/pjmd_conff.c:1053: 警告: passing argument 1 of set_rscGrpNode_type4 discards qualifiers from pointer target type
gcc和g++常用编译参数
gcc和g++常⽤编译参数-w -W -Wall -w 关闭编译警告。
平时编写c/c++代码如果不规范,编译的时候会抛出很多警告。
但是⼀般的警告都是可以忽略的,⽐如类型转换。
编译的时候可以加-w关闭警告 -W 也是关闭编译警告,但是⽐-w智能⼀些,它只会显⽰编辑器认为会出错的警告 -Wall, 显⽰所有警告。
⽐如下⾯的代码,test.c gcc -o a.out test.c -Wall, 把所有的警告都显⽰出来了,没有使⽤的变量i,在void函数返回了double。
gcc -o a.out test.c -W,只显⽰了编译器认为会出错的警告,没有使⽤变量i的那个警告编译器认为不会出错,所以没有输出。
gcc -o a.out test.c -w,屏蔽了所有警告,只输出错误-g -g3 gcc ⽀持4中级别的调试信息,-g0表⽰不⽣成调试信息,-g3表⽰⽣成最多的调试信息。
-g默认为-g2。
⼀般的调试信息包括⾏号,函数,外部变量。
-g3包含其他额外的调试信息,⽐如宏定义。
-O1 -O2 -O3 -Os -O系列选项主要⽤于优化代码。
-O和-O1是等价的,不影响编译速度,并且会采⽤⼀些优化算法,降低代码⼤⼩并提⾼代码运⾏速度。
-O2,会降低编译速度,但是除了包含-O1的优化算法之外,还会采⽤⼀些其他的优化算法来提⾼代码运⾏速度。
-O3,除了包含-O2所有的优化外,会采取⼀些向量化算法,提⾼代码的并⾏执⾏程度,使之更充分地利⽤现代cpu的流⽔线和cache。
-Os,-O3即使是增加代码的⼤⼩,也要提⾼运⾏速度。
⽽这个选项在-O2的基础上,尽量减少⽬标的⼤⼩,这个经常⽤于存储量⽐较⼩的设备。
-fno-strict-aliasing 当优化级别在-O2即以上时,strict-aliasing会被采⽤。
编译器会假设代码中没有强制转换,从⽽会使⽤更加激进的优化算法对代码进⾏优化。
也就是说,代码中如果存在类似于下⾯的代码就会出错: int num = 1.0; double *p = (int *)(&num); 所以当优化级别在-O2及以上时,应该使⽤-fno-strict-aliasing关闭strict-aliasing。
gcc常见的编译警告与错误(按字母顺序排列)
gcc 常见的编译警告与错误〔按字母顺序排列〕C语言初学者遇到的最大问题往往是看不懂编译错误,进而不知如何修改程序。
有鉴于此,本附录罗列了用gcc编译程序时经常出现的编译警告与错误。
需要提醒读者的是,出现警告〔warning〕并不影响目标程序的生成,但出现错误〔error〕则无法生成目标程序。
为便于读者查阅,下面列出了经常遇到的警告与错误,给出了中英文对照〔英文按字典顺序排列〕,并对局部错误与警告做了必要的解释。
*%s e*pects \FILENAME\ or …*%s 需要\FILENAME\ 或…*%s is a deprecated GCC e*tension*%s 是一个已过时的GCC 扩展*%s is a GCC e*tension*%s 是一个GCC 扩展*~ error:*~ 错误:*~ In file included from %s:%u*~ 在包含自%s:%u 的文件中*~ internal error:*~ 内部错误:*~ no newline at end of file*~ 文件未以空白行完毕*~ warning:*~ 警告:*elif after *else*elif 出现在*else 后*elif without *if*elif 没有匹配的*if*else after *else*else 出现在*else 后*else without *if*else 没有匹配的*if*endif without *if*endif 没有匹配的*if*include nested too deeply*include 嵌套过深*include_ne*t in primary source file*include_ne*t 出现在主源文件中*pragma %s %s is already registered*pragma %s %s 已经被注册*pragma %s is already registered*pragma %s 已经被注册*pragma once in main file*pragma once 出现在主文件中*pragma system_header ignored outside include file*pragma system_heade 在包含文件外被忽略%.*s is not a valid universal character%.*s 不是一个有效的Unicode 字符%s in preprocessing directive预处理指示中出现%s%s is a block device%s 是一个块设备%s is shorter than e*pected%s 短于预期%s is too large%s 过大%s with no e*pression%s 后没有表达式%s: not used because `%.*s’ defined as `%s’ not `%.*s’%s:未使用因为‘%.*s’被定义为‘%s’而非‘%*.s’%s: not used because `%.*s’ is poisoned%s:未使用因为‘%.*s’已被投毒%s: not used because `%.*s’ not defined%s:未使用因为‘%.*s’未定义%s: not used because `%s’ is defined%s:未使用因为‘%s’已定义%s: not used because `__COUNTER__’ is invalid%s:未使用因为‘__COUNTER__’无效(\%s\ is an alternative token for \%s\ in C++)(在C++ 中"%s〞会是"%s〞的替代标识符)(this will be reported only once per input file)(此警告为每个输入文件只报告一次)\%s\ after * is not a positive integer* 后的"%s〞不是一个正整数\%s\ after *line is not a positive integer*line 后的"%s〞不是一个正整数\%s\ cannot be used as a macro name as it is an operator in C++ "%s〞不能被用作宏名,因为它是C++ 中的一个操作符\%s\ is not a valid filename"%s〞不是一个有效的文件名\%s\ is not defined"%s〞未定义\%s\ may not appear in macro parameter list"%s不能出现在宏参数列表中\%s\ re-asserted重断言"%s〞\%s\ redefined"%s重定义\/*\ within ment"/*出现在注释中\\* used with no following he* digits\\* 后没有16 进制数字\defined\ cannot be used as a macro name"defined不能被用作宏名__COUNTER__ e*panded inside directive with -fdirectives-only带-fdirectives-only 时__COUNTER__ 在指示中扩展__VA_ARGS__ can only appear in the e*pansion of a C99 variadic macro __VA_ARGS__ 只能出现在C99 可变参数宏的展开中_Pragma takes a parenthesized string literal_Pragma 需要一个括起的字符串字面常量‘%.*s’ is not in NFC‘%.*s’不在NFC 中‘%.*s’ is not in NFKC‘%.*s’不在NFKC 中‘**’ cannot appear at either end of a macro e*pansion‘**’不能出现在宏展开的两端‘*’ is not followed by a macro parameter‘*’后没有宏参数‘$’ in identifier or number‘$’出现在标识符或数字中‘:’ without preceding ‘"’‘:’前没有‘"’‘"’ without following ‘:’‘"’后没有‘:’'return' with a value, in function returning void在void返回类型的函数中,return返回值。
如何解决C语言中的编译错误与警告
如何解决C语言中的编译错误与警告C语言是一种广泛应用于系统编程和嵌入式开发的编程语言,它的编译过程中常常会出现各种错误和警告。
这些错误和警告可能会导致程序无法正确编译或者在运行时出现问题。
因此,解决C语言中的编译错误与警告是每个程序员都需要掌握的重要技能。
本文将介绍一些常见的编译错误和警告,并提供一些解决方法。
一、理解编译错误和警告的含义在解决编译错误和警告之前,我们首先需要理解它们的含义。
编译错误是指在编译过程中发现的语法错误或者逻辑错误,这些错误会导致程序无法正确编译。
编译警告是指在编译过程中发现的一些潜在的问题,虽然不会导致程序无法编译,但可能会导致程序在运行时出现问题。
二、常见的编译错误和警告1. 语法错误:语法错误是最常见的编译错误之一,它通常是由于编程人员在编写代码时遗漏了分号、括号不匹配等导致的。
解决语法错误的方法是仔细检查代码,确保语法正确。
2. 未声明的标识符:当使用一个未声明的标识符时,编译器会报错。
解决这个问题的方法是在使用标识符之前先进行声明或者引入相应的头文件。
3. 类型不匹配:类型不匹配是指在赋值或者函数调用过程中,变量的类型与期望的类型不一致。
解决这个问题的方法是检查变量的类型,并进行相应的类型转换。
4. 未使用的变量:编译器会对未使用的变量发出警告,这可能是由于代码中存在一些无用的变量。
解决这个问题的方法是删除未使用的变量或者对其进行使用。
5. 未初始化的变量:未初始化的变量可能导致程序在运行时出现未定义的行为。
解决这个问题的方法是在使用变量之前先进行初始化。
6. 函数返回值不匹配:函数的返回值类型与函数定义时声明的返回值类型不一致会导致编译错误。
解决这个问题的方法是检查函数的返回值类型,并进行相应的修改。
7. 潜在的内存泄漏:编译器可能会对未释放的内存发出警告,这可能会导致内存泄漏。
解决这个问题的方法是在使用完内存后及时释放。
三、解决编译错误和警告的方法1. 仔细阅读编译错误和警告信息:编译器通常会提供详细的错误和警告信息,我们应该仔细阅读这些信息,找出问题所在。
常见gcc编译问题解决方法集
常见gcc编译问题解决⽅法集除⾮明确说明,本⽂内容仅针对x86/x86_64的Linux开发环境,有朋友说baidu不到,开个贴记录⼀下(加粗字体是关键词):⽤“-Wl,-Bstatic”指定链接静态库,使⽤“-Wl,-Bdynamic”指定链接共享库,使⽤⽰例:-Wl,-Bstatic -lmysqlclient_r -lssl -lcrypto -Wl,-Bdynamic -lrt -Wl,-Bdynamic -pthread -Wl,-Bstatic -lgtest ("-Wl"表⽰是传递给链接器ld的参数,⽽不是编译器gcc/g++的参数。
)1) 下⾯是因为没有指定链接参数-lz(/usr/lib/libz.so,/usr/lib/libz.a )/usr/local/mysql/lib/mysql/libmysqlclient.a(my_compress.c.o): In function `my_uncompress':/home/software/mysql-5.5.24/mysys/my_compress.c:122: undefined reference to `uncompress'/usr/local/mysql/lib/mysql/libmysqlclient.a(my_compress.c.o): In function `my_compress_alloc':/home/software/mysql-5.5.24/mysys/my_compress.c:71: undefined reference to `compress'2) 下⾯是因为没有指定编译链接参数-pthread(注意不仅仅是-lpthraed)/usr/local/mysql/lib/mysql/libmysqlclient.a(charset.c.o): In function `get_charset_name':/home/zhangsan/mysql-5.5.24/mysys/charset.c:533: undefined reference to `pthread_once'3) 下⾯这个是因为没有指定链接参数-lrt/usr/local/thirdparty/curl/lib/libcurl.a(libcurl_la-timeval.o): In function `curlx_tvnow':timeval.c:(.text+0xe9): undefined reference to `clock_gettime'4) 下⾯这个是因为没有指定链接参数-ldl/usr/local/thirdparty/openssl/lib/libcrypto.a(dso_dlfcn.o): In function `dlfcn_globallookup':dso_dlfcn.c:(.text+0x4c): undefined reference to `dlopen'dso_dlfcn.c:(.text+0x62): undefined reference to `dlsym'dso_dlfcn.c:(.text+0x6c): undefined reference to `dlclose'5) 下⾯这个是因为指定了链接参数-static,它的存在,要求链接的必须是静态库,⽽不能是共享库ld: attempted static link of dynamic object如果是以-L加-l⽅式指定,则⽬录下必须有.a⽂件存在,否则会报-l的库⽂件找不到:ld: cannot find -lACE6) GCC编译遇到如下的错误,可能是因为在编译时没有指定-fPIC,记住:-fPIC即是编译参数,也是链接参数relocation R_x86_64_32S against `vtable for CMyClass` can not be used when making a shared object7) 下⾯的错误表⽰gcc编译时需要定义宏__STDC_FORMAT_MACROS,并且必须包含头⽂件inttypes.htest.cpp:35: error: expected `)' before 'PRIu64'8) 下⾯是因为在x86机器(32位)上编译没有指定编译参数-march=pentium4../../src/common/libmooon.a(logger.o): In function `atomic_dec_and_test':../../include/mooon/sys/atomic_gcc.h:103: undefined reference to `__sync_sub_and_fetch_4'9) 下列错误可能是因为多了个“}”error: expected declaration before '}' token10) 下列错误可能是因为少了个“}”error: expected `}' at end of input11) 下⾯这个错误是编译⼀个共享库时,该共享库依赖的⼀静态库编译时没有加“-fPIC”参数,解决⽅法为带“-fPIC”重新编译被依赖的静态库relocation R_X86_64_32 against `a local symbol' can not be used when making a shared object; recompile with -fPIC12) 下⾯这个错误,是因为头⽂件中使⽤“_syscall0(pid_t, gettid)”不当引起的./test.o: In function `gettid()':./test.h:17: multiple definition of `gettid()'正确的⽤法是使⽤"inline"或"static inline"修饰⼀下:inline _syscall0(pid_t, gettid)或static inline _syscall0(pid_t, gettid)当然也可以这样:在.h头⽂件中:extern "C" pid_t gettid(void);在.cpp⽂件中:_syscall0(pid_t, gettid)_syscall0是⼀个宏,定义⼀个函数的实现。
[VIP专享]gcc编译c问题
1) B2Ak+22+12=+15+c51mc+=5m=2c111++m+12+21+++2=12=2+1+2+1+2+2+22+32k+1+2
88.8918÷.12990.÷1=4214÷3922=.0034=1÷15251371=8.535.78208÷.0232173c0*0÷1=m920.30392.2c=1÷203m=2÷1202.52=3535=42314)c*5232m40341*.31252=3.*1.153.5*03134.2*920522..104455=+21*3*50202.2.0285.4850.13*50+5c8*125*12m0.2+050.+0*014.852*0051000+0+/038.T+0÷+=55*+1011+010+91÷0145405*00010200+5+0+080+40*04+***115.103910*-%*C%6(+÷*M==5M÷5)0*3*0(31÷3110**5*+*÷414.m2371e=%7)8n08%.=s8.5=77.93cc60.mc*m4*m13,101w9.9o.k24mc-.cem5nm2csp2665m*9..03-4.50c60*5.pc3m85,9cm0.5g.i50mr0l-.p.s85p/6c50bc.0om7m.yp.cs6pc5m+;c0m..m7.ckm; 1+1k+12+1+k2234=1c+m1++4+4+2
gcc报错
个人总结:1. gcc 预处理阶段-E常见错误:No such file or directorygcc -E file.c -o file.i 其中file.i为预处理后的c文件,gcc所做的工作是将头文件的内容迭代包含到i 文件,c文件的代码不变。
此时如果gcc在默认路径没有搜索到c 文件中包含的h文件,则出现错误。
i 文件仍是c文件。
解决办法:增加搜索路径。
2.gcc 编译阶段-S常见错误:变量未声明;expected ";" before ;提供给函数"function-name"的参数太少这一阶段将c文件转为s 汇编文件,会对变量是否声明,“;”是否缺失等进行简单语法检查;但并不对函数是否声明进行检查,即使没有声明第一次使用,函数转换后的汇编为:call function-name 。
解决办法:查看变量的声明是否被包含进c文件,是否头文件未包含,或根本未定义。
语句末加" ; "。
函数声明的参数少于调用时的参数不会出现问题,反过来就不可以。
3.gcc 汇编阶段-c4.gcc 链接阶段常见错误:a) 如:In function ' main': undefined reference to ' funtion-name'Collect2: ld return 1解决办法:不能找到函数的声明,看是否函数声明了,或者相应的头文件有无包含。
b) 如:解决办法:5 Segmentation fault报错Char* string;String = (char*)malloc(sizeof(char)*1000);String="";Strcat(string, "sfasfasf");原因:string="", 使string指针指向另一块地址,不再是malloc申请的地址。
【GCC】gcc警告选项汇总--编辑中gcc编译选项
【GCC】gcc警告选项汇总--编辑中gcc编译选项⽬录参考原⽂:https:///qq_17308321/article/details/79979514前⾔警告:不是错误的,但是有风险或表明可能有错误。
英⽂原⽂:请求或取消警告选项加上-Wall吧,gcc 默认不加参数的情况下连定义了返回值的函数没有返回值都不报错。
-Wall,-Wextra 就是加-Wall 和-Wall不启动的选项也加上()-fsyntax-only检查代码中的语法错误,但除此之外不要做任何事情。
-w (⼩写)禁⽌所有警告消息。
-W (⼤写)以“ -W ”请求特定的警告 - 可以隐式地请求隐式声明的警告。
-W和-Wall的区别-Wall选项意思是编译后显⽰所有警告。
-W选项类似-Wall,会显⽰警告,但是只显⽰编译器认为会出现错误的警告。
在编译⼀些项⽬的时候可以-W和-Wall选项⼀起使⽤。
gcc -W -Wall test_w_wall testwwall.c-Werror=将指定的警告转换为错误。
请注意,指定-Werror = foo会⾃动隐含-W foo 。
但是, -Wno-error = foo并不意味着什么。
反过来:-Wno-error取消编译选项-Werror⽤途:假设我们使⽤了⼀个⼈的代码A⽬录,⾥⾯有⼀个-Werror的选项,把所有的警告当做错误;⼜使⽤了另⼀个⼈的代码B⽬录,⾥⾯存在⼀堆Warning。
这样,当我们把它们合在⼀起编译的时候,A中的-Werror选项会导致B的代码编译不过。
但我们⼜不想去修改B的代码,怎么办?⽅法是,先add_subdirectory(A),之后,加上⼀句set(CMAK_CXX_FLAGS "${CMAK_CXX_FLAGS} -Wno-error")-Wno-这个前缀,就是⽤来取消⼀个编译选项的然后,再add_subdirectory(B)-Wfatal-errors在发⽣第⼀个错误时中⽌编译。
gcc警告选项汇总
gcc警告选项汇总
警告是诊断消息,报告的结构本质上不是错误的,但是有风险或表明可能有错误。
以下与语言无关的选项不会启用特定的警告,但会控制GCC生成的诊断类型。
-fsyntax-only
检查代码中的语法错误,但除此之外不要做任何事情。
-fmax-errors= n
将错误消息的最大数量限制为n ,此时GCC会缓存,而不是尝试继续处理源代码。
如果n为0(默认值),则生成的错误消息数量不受限制。
如果还指定了-Wfatal-errors ,则重大错误优先于此选项。
-w
禁止所有警告消息。
-Werror
使所有的警告进入错误。
-Werror=
将指定的警告转换为错误。
附加警告的说明符; 例如-Werror =开关将由-Wswitch控制的警告转换为错误。
此开关采用否定形式,用于否定-针对特定警告的错误; 例如-Wno-error =开关使得-wswitch警告不是错误,即使在-Werror有效时也是如此。
每个可控警告的警告消息都包含控制警告的选项。
那么该选项可以与-Werror =和-Wno-error =一起使用,如上所述。
(可以使用-fno-diagnostics-show-option标志禁用警告消息中的选项打印。
)请注意,指定-Werror = foo会自动隐含-W foo 。
但是,-Wno-error = foo并不意味着什么。
常见gcc编译警告
1、warning: no newline at end of file在文件最后一行加上回车键解释:在《Rationale for the C99 standard》一文中,有C99的相关信息:A backslash immediately before a newline has long been used to continue string literals, as well as preprocessing command lines、In the interest of easing machine generation of C, and of transporting code to machines with restrictive physical line lengths, the C89 Committee generalized this mechanism to permit any token to be continued by interposing abackslash/newline sequence、c/c++代码的每一行后面有一个“结束符”,也就就是newline。
避免当被include的文件展开后,前一个文件的最后一行与后一个文件的第一行直接被连接成一行从而造成错误。
2、warning: comparison between pointer and integer解释:integer与pointer比较3、 warning: assignment discards qualifiers from pointer target type解释:赋值时,取消了右值的限定。
4、 warning: passing argument 1 of 'send' makes pointer from integer without a cast解释:函数send的第一个integer型参数没有强制转换为pointer型5、warning: comparison is always true due to limited range of data type解释:由于数据类型范围的限制,比较结果一直为真。
gcc编译报错解决方案
Gcc最基本的用法是∶gcc [options] [filenames] 其中options就是编译器所需要的参数,filenames给出相关的文件名称。
-c,只编译,不连接成为可执行文件,编译器只是由输入的.c等源代码文件生成.o为后缀的目标文件,通常用于编译不包含主程序的子程序文件。
-o output_filename,确定输出文件的名称为output_filename,同时这个名称不能和源文件同名。
如果不给出这个选项,gcc就给出预设的可执行文件a.out。
1.linker input file unused because linking not done我在Windows下使用SQLite编了个C++程序,在编写Makefile并使用cygwin 中的g++进行编译链接时遇到如下的错误:linker input file unused because linking not done我的语句是g++ -c a.cpp -lsqlite3到网上查了一下,问题出在链接数据库的语句不应出现在编译语句里面。
上面的语句里面有-c 即编译compile,所以命令会忽略掉所有的-l 链接库的命令。
而要链接数据库,应该在生成可执行文件时才使用。
正确的使用链接的语句应该是g++ a.o -L. -lsqlite3 -o exename2.Linux系统的头文件和库文件搜索路径**#include**的头文件,连结数据库,系统定义,总共有下列来源指定gcc去那找。
∙当初在编译时指定的(在~gcc/gcc/collect2.c:locatelib()∙写在specs内的(针对rpm包)∙后来用-D -I -L指定的∙gcc环境变量设定(编译的时候)∙ld.so的环境变量(这是run time的时候)头文件gcc 在编译时如何去寻找所需要的头文件:∙header file的搜寻会从-I开始∙然后找gcc的环境变量C_INCLUDE_PA TH,CPLUS_INCLUDE_PATH,OBJC_INCLUDE_PA TH∙再找内定目录:o/usr/includeo/usr/local/includeo/usr/lib/gcc-lib/i386-linux/2.95.2/includeo/usr/lib/gcc-lib/i386-linux/2.95.2/../../../../include/g++-3o/usr/lib/gcc-lib/i386-linux/2.95.2/../../../../i386-linux/include∙库文件但是如果装gcc的时候,是有给定的prefix的话,那么就是o/usr/includeo prefix/includeo prefix/xxx-xxx-xxx-gnulibc/includeo prefix/lib/gcc-lib/xxxx-xxx-xxx-gnulibc/2.8.1/include库文件cos()等函式库的选项要多加-lm∙编译的时候:gcc会去找-L∙再找gcc的环境变量LIBRARY_PATH∙再找内定目录/lib /usr/lib /usr/local/lib 这是当初compile gcc时写在程序内的运行时动态库的搜索路径1 在配置文件/etc/ld.so.conf中指定动态库搜索路径2 通过环境变量LD_LIBRARY_PA TH指定动态库搜索路径(当通过该环境变量指定多个动态库搜索路径时,路径之间用冒号":"分隔)3 在编译目标代码时指定该程序的动态库搜索路径(还可以在编译目标代码时指定程序的动态库搜索路径。
16种C语言编译警告(Warning)类型的解决方法
16种C语⾔编译警告(Warning)类型的解决⽅法当编译程序发现程序中某个地⽅有疑问,可能有问题时就会给出⼀个警告信息。
警告信息可能意味着程序中隐含的⼤错误,也可能确实没有问题。
对于警告的正确处理⽅式应该是:尽可能地消除之。
对于编译程序给出的每个警告都应该仔细分析,看看是否真的有问题。
只有那些确实⽆问题的警告才能放下不管。
说明:由于编译的警告各种各样,根本不可以⼀⼀罗列出来,下⾯只是列举出⽐较典型的⼀些警告,还有⼀些警告,⼤家只要根据字⾯意思,就可以很快的查找出来,并解决之。
类型1:显⽰:warning: implicit declaration of function 'Example()'。
警告原因:在你的.c⽂件中调⽤了函数Example(),可是你并没有把声明这个函数的相应的.h⽂件包含进来。
有可能你在⼀个.c⽂件中定义了这个函数体,但并没有在.h中进⾏声明。
解决⽅法:你可以在调⽤这种函数的.c⽂件的⼀开始处加上:extern Example();你可以在调⽤这种函数的.c⽂件中包含进声明了函数Example()的头⽂件。
如果你在⼀个.c⽂件中定义了这个函数体,但并没有在.h中进⾏声明,不嫌⿇烦的话,你也可以去⽣成⼀个.h⽂件,加上你的函数声明。
类似的警告:warning: type mismatch with previous implicit declarationwarning: type mismatch with previous implicit declarationwarning: previous implicit declaration of 'Example()'类型2:显⽰:warning: unused variable 'param'。
警告原因:很明显,是您定义了变量‘param',却根本没有使⽤它。
解决⽅法:不需要⽤的话,就删了它吧。
C语言编译环境中常见错误提示
C语言编译环境中常见错误提示编译中的常见错误例析(1) 警告类错误‘XXX’declare but never used 变量XXX已定义但从未用过。
‘XXX’is assigned a value which is never used 变量XXX已赋值但从未用过。
Code has no effect 程序中含有没有实际作用的代码。
Non-portable pointer conversion 不适当的指针转换,可能是在应该使用指针的地方用了一个非0的数值。
Possible use of ‘XXX’before definition 表达式中使用了未赋值的变量Redeclaration of ‘main’一个程序文件中主函数main不止一个。
Suspicious pointer conversion 可疑的指针转换。
通常是使用了基本类型不匹配的指针。
Unreachable code 程序含有不能执行到的代码。
(2) 错误或致命错误Compound statement missing } in function main 程序结尾缺少括号}。
“}”expected;“(”expected等复合语句或数组初始化的结尾缺少“)”;“(”。
Case outside of switch case 不属于Switch结构,多由于switch结构中的花括号不配对所致。
Case statement missing ‘:’switch结构中的某个case之后缺少冒号。
Constant expression required 定义数组时指定的数组长度不是常量表达式。
Declaration syntax error 结构体或联合类型的定义后缺少分号。
Declaration was expected 缺少说明,通常是因为缺少分界符如逗号、分号、右圆括号等所引起的。
Default outside switch Default部分放到了switch结构之外,一般是因为花括号不匹配而引起的。
解密C语言编译过程中的各类warning提示
解密C语言编译过程中的各类warning提示在进行C语言编程时,我们经常会遇到各种warning提示。
这些warning提示是编译器对代码中可能存在的问题进行的警告,虽然不会导致程序无法运行,但是却可能会影响程序的性能、可读性和可维护性。
本文将解密C语言编译过程中的各类warning提示,帮助读者更好地理解和解决这些问题。
1. 未使用的变量在编写代码时,我们可能会定义一些变量但没有使用它们。
这在大型项目中尤为常见,因为代码可能经常被修改和更新。
编译器会发出未使用变量的warning提示,提醒我们检查代码并删除或使用这些变量。
未使用的变量不仅浪费了内存空间,还可能导致其他开发人员产生困惑。
解决方法:可以通过删除未使用的变量或者在代码中使用这些变量来解决这个问题。
如果这些变量是有意保留的,可以使用编译器指令来禁用这个warning提示。
2. 未初始化的变量C语言中,变量必须在使用之前进行初始化。
如果我们在使用变量之前没有对其进行初始化,编译器会发出未初始化变量的warning提示。
未初始化的变量可能会导致程序产生不可预测的行为,因为它们的值是不确定的。
解决方法:在使用变量之前,确保对其进行初始化。
可以通过给变量赋予一个默认值或者在声明变量时进行初始化来解决这个问题。
3. 函数定义与声明不匹配在C语言中,函数的定义和声明必须匹配。
如果函数的定义和声明不一致,编译器会发出函数定义与声明不匹配的warning提示。
这可能是因为函数的参数类型、返回值类型或者参数个数不一致。
解决方法:检查函数的定义和声明,确保它们一致。
可以通过修改函数的参数类型、返回值类型或者参数个数来解决这个问题。
4. 隐式类型转换C语言中,存在隐式类型转换的情况。
当我们将一个较小的数据类型赋值给一个较大的数据类型时,编译器会发出隐式类型转换的warning提示。
隐式类型转换可能导致数据的精度丢失或者产生不可预测的结果。
解决方法:显式地进行类型转换,确保数据类型的一致性。
GCC警告选项例解
GCC警告选项例解程序员是追求完美的一族,即使是一般的程序员大多也都不想看到自己的程序中有甚至那么一点点的瑕疵。
遇到任意一条编译器警告都坚决不放过。
有人会说:我们可以使用比编译器更加严格的静态代码检查工具,如splint。
这个建议也很不错。
不过lint工具使用起来较繁琐,有时候还需要记住一些特定符号并插入到你自己的代码中才行,门槛较高,这也让很多人止步于此。
那么我们就从此放弃么?不,如今的编译器做得都很好,它可以帮助我们的找到绝大多数可能出现问题的代码,前提是你要学会控制编译器去找到这些问题代码,而熟悉编译器的警告选项恰恰是体现控制力的好方法。
当你可以自如控制编译器警告输出的时候,你就算是'入道'了,同时你对语言的理解也更进一步了。
有人说:我就是用一个-Wall选项就可以了,一般选手可以这么做,而且他可以不知道-Wall会跟踪哪些类型的问题;但是高级选手是不会只使用-Wall的,他会把每条警告都研究的很透彻,会在Makefile中列出他想让编译器输出哪些类型的警告以替代-Wall,他会屏蔽掉那些对他的代码'毫无用处'的警告(很可能他使用了编译器对语言的扩展功能),他会有个和编译器交流的过程。
俗话说:'工欲善其事,必先利其器',一直在工作中使用GNU C编译器(以下简称GCC),这里对GCC的一些警告选项细致的分析,并列举几个简单的例子[注1]供分析参考。
1. -Wall集合警告选项我们平时可能大多数情况只使用-Wall编译警告选项,实际上-Wall选项是一系列警告编译选项的集合。
下面逐一分析这一集合中的各个选项:[-Wchar-subscripts]如果数组使用char类型变量做为下标值的话,则发出警告。
因为在某些平台上char可能默认为signed char,一旦溢出,就可能导致某些意外的结果。
e.g./* test_signed_char.c */#includeint main () {char c = 255; // 我们以为char是无符号的,其范围应该是[0,255]int i = 0;int a[256];for (i = 0; i < 256; i++) {a[i] = 1;}printf("%d\n", c); // 我们期待输出255printf("%d\n", a[c]); // 我们期待输出1printf("%d\n", a[255]);return 0;}gcc -Wchar-subscripts test_signed_char.ctest_signed_char.c: In function `main':test_signed_char.c:13: warning: array subscript has type `char'其输出结果:-1-41974761从输出结果来看Solaris 9/gcc 3.2上char默认实现类型为signed char;在Windows XP/gcc-3.4.2上也是一样。
gcc 警告安全级别
gcc 警告安全级别一、-Wall级别下的警告-Wall是GCC中一个常用的警告选项,它会启用大多数的警告信息。
在这个级别下,GCC会对代码中的潜在问题进行提示,开发者可以根据这些警告信息进行代码的优化和改进。
例如,当我们在代码中使用了未声明的变量时,GCC会给出警告信息,提示我们可能存在的问题。
这种警告可以帮助我们发现代码中的潜在错误,并及时修复。
在-Wall级别下,GCC还会对一些常见的编程错误进行提示,比如使用未初始化的变量、函数返回值未使用等。
这些警告信息可以帮助我们提高代码的可靠性和健壮性。
二、-Wextra级别下的警告-Wextra是GCC中的另一个常用的警告选项,它启用了更多的警告信息。
在这个级别下,GCC会对代码中的一些潜在问题进行更加详细的提示。
例如,当我们在代码中使用了不安全的函数时,GCC会给出警告信息,提示我们可能存在的安全风险。
这种警告可以帮助我们避免使用一些已知的不安全函数,从而提高代码的安全性。
在-Wextra级别下,GCC还会对代码中的一些潜在的逻辑错误进行提示。
例如,当我们在条件语句中使用了错误的比较符号时,GCC会给出警告信息,帮助我们发现和修复这些潜在的逻辑错误。
三、-Werror级别下的警告-Werror是GCC中的一个特殊的警告选项,它会将所有的警告信息视为错误,即在编译过程中如果出现了任何警告信息,GCC都会将其视为错误并停止编译。
在使用-Werror选项时,我们需要对代码中的所有警告信息进行仔细的检查和处理,确保代码的质量和可靠性。
这种方式可以帮助我们及时发现和解决代码中的问题,并提高代码的可维护性。
然而,使用-Werror选项也需要谨慎,因为有些警告信息可能并不是真正的问题,而是编译器的一些限制或者特性。
在处理这些警告信息时,我们需要仔细分析,并根据实际情况进行调整。
四、-Wno-<警告类型>选项除了上述提到的几个常用的警告选项外,GCC还提供了一些特定的警告选项,可以根据实际需求进行选择和使用。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1、warning: no newline at end of file
在文件最后一行加上回车键
解释:在《Rationale for the C99 standard》一文中,有C99的相关信息:
A backslash immediately before a newline has long been used to continue string literals, as well as preprocessing command lines. In the interest of easing machine generation of C, and of transporting code to machines with restrictive physical line lengths, the C89 Committee generalized this mechanism to permit any token to be continued by interposing a
backslash/newline sequence.
c/c++代码的每一行后面有一个“结束符”,也就是newline。
避免当被include的文件展开后,前一个文件的最后一行与后一个文件的第一行直接被连接成一行从而造成错误。
2、warning: comparison between pointer and integer
解释:integer与pointer比较
3、 warning: assignment discards qualifiers from pointer target type
解释:赋值时,取消了右值的限定。
4、 warning: passing argument 1 of 'send' makes pointer from integer without a cast
解释:函数send的第一个integer型参数没有强制转换为pointer型
5、warning: comparison is always true due to limited range of data type
解释:由于数据类型范围的限制,比较结果一直为真。
6、warning: initialization from incompatible pointer type
解释:不兼容指针类型的初始化
7、 warning: return makes pointer from integer without a cast
解释:return使integer转换为pointer,没有加强制类型转换。
8、warning: incompatible implicit declaration of built-in function 'printf'
解释:与内置的printf函数隐士声明不兼容。
9、warning: initialization discards qualifiers from pointer target type
解释:initialization取消了指针目标类型的限定。
10、warning: comparison is always false due to limited range of data type
由于类型限制,比较一直是假
11、warning: assignment from incompatible pointer type
不兼容的指针间赋值
12、warning: passing argument 1 of 'mes_read_time' discards qualifiers from pointer target type12、mes_函数第一个参数的传递,丢弃了指针目标类型限定。
13、warning: "protocol_type" redefined
——type重定义
14、warning: 'return' with a value, in function returning void
在void返回类型的函数中,return返回值。