GCC 常见错误解析

1
GCC 常见错误解析
一、错误类型
第一类∶C 语法错误
错误信息∶文件source.c 中第n 行有语法错误(syntex errror)。
这种类型的错误,一般都是 C 语言的语法错误,应该仔细检查源代码文件中
第n 行及该行之前的程序,有时也需要对该文件所包含的头文件进行检查。
有些情况下,一个很简单的语法错误,gcc 会给出一大堆错误,此时要保持清
醒的头脑,不要被其吓倒,必要的时候再参考一下C 语言的基本教材。
第二类∶头文件错误
错误信息∶找不到头文件head.h(Can not find include file head.h)。
这类错误是源代码文件中的包含头文件有问题,可能的原因有头文件名错误、
指定的头文件所在目录名错误等,也可能是错误地使用了双引号和尖括号。
第三类∶档案库错误
错误信息∶连接程序找不到所需的函数库,例如∶ld: -lm: No such file or
directory.
这类错误是与目标文件相连接的函数库有错误,可能的原因是函数库名错误、
指定的函数库所在目录名称错误等,检查的方法是使用find 命令在可能的目录中寻
找相应的函数库名,确定档案库及目录的名称并修改程序中及编译选项中的名称。
第四类∶未定义符号
错误信息∶有未定义的符号(Undefined symbol)。
这类错误是在连接过程中出现的,可能有两种原因∶一是使用者自己定义的函
数或者全局变量所在源代码文件,没有被编译、连接,或者干脆还没有定义,这需
要使用者根据实际情况修改源程序,给出全局变量或者函数的定义体;二是未定义
的符号是一个标准的库函数,在源程序中使用了该库函数,而连接过程中还没有给
定相应的函数库的名称,或者是该档案库的目录名称有问题,这时需要使用档案库
维护命令ar 检查我们需要的库函数到底位于哪一个函数库中,确定之后,修改gcc
连接选项中的-l 和-L 项。
排除编译、连接过程中的错误,应该说这只是程序设计中最简单、最基本的一
个步骤,可以说只是开了个头。这个过程中的错误,只是我们在使用C 语言描述
一个算法中所产生的错误,是比较容易排除的。我们写一个程序,到编译、连接通
过为止,应该说刚刚开始,程序在运行过程中所出现的问题,是算法设计有问题,
说得更玄点是对问题的认识和理解不够,还需要更加深入地测试、调试和修改。一
个程序,稍为复杂的程序,往往要经过多次的编译、连接和测试、修改。
二、常见错误信息解析与处理
2
1、预处理时的错误信息
No such file or directory
中文含义:没有相应文件或目录
错误原因:编译器的搜索路径上找不到所需要的文件。该文件可能已在命令行
中指定,或在 #include 语句中说明。
处理方法:查看文件名是否正确,或文件所存放的目录是否已添加到系统目录
或链接目录中。以下是样例:
#include <stdoi.h> /* 错误:文件名不正确 */
int main (void){
printf ("Hello World!/n");
return 0;
}
上面的程序试图引入一个不存在的文件‘stdoi.h’ ,这就会引发如下错误:
‘stdoi.h: No such file or directory’。而正确的文件名应该是‘stdio.h’。
macro or ‘#include‘ recursion too deep
中文含义:宏或‘#include‘ 递归太深
错误原因:语句 #include 嵌套太深。当预处理器遇到太多嵌套的 #include 指
令时,会导致此错误。通常该错误由两个或多个文件进行相互引用时,会引发无限
递归。如:
/* foo.h */
#include "bar.h"
...
/* bar.h */
#include "foo.h"
...
解决方法是确保各文件没有互相引用。
invalid preprocessing directive #...
中文含义:非法的预处理命令#...
错误原因:该错误指明预处理器遇到了不可识别的 # 命令。如:
#if FOO
int x = 1;
#elseif BAR /* 应写成 #elif */
int x = 2;
#else
int x = 3;
#endif
预处理器语法在 #if 块中需要 #elif 而不是 "else if" 条件,也不是
#elseif。
warning: This file includes at least one deprecated or
3
antiquated header.
中文含义:警告:文件中至少引用了一个已废弃的或过时的头文件
错 误 原 因 : 该 错 误 通 常 是 在 C++ 程序中引用了旧式的头文件库,
如’iostream.h’, 在现代C++库头文件没有’.h’扩展名。旧头文件导入其函数
到顶层全局名字空间,对C++需要使用std:: 名字空间。当然,对旧式风格的头
文件仍然支持,所以对现有程序会继续编译,只是给出警告。如:
#include <iostream.h> /* 旧式风格 */
int main (void){
cout << "Hello World!/n";
return 0;
}
‘iostream.h’应改写为 #include <iostream> 及 std::cout 。
unterminated ‘#if‘ conditional
中文含义:‘#if‘ 语句条件没有终止
错误原因:缺少 #endif 语句
2、编译时的错误信息
‘variable‘ undeclared (first use in this function)
中文含义:变量‘variable‘ 没有声明(第一次使用此变量)
解决方法:在使用前声明该变量。
解析:在 C 和C++中,变量必须先声明后使用。如:
int main (void){
int i;
j = 0; /* j 变量没声明 */
return j;
}
此例中,j 是没经声明的变量,所以将触发错误:‘j‘ undeclared.
parse error before ‘...‘
中文含义:在 ‘XXX‘ 语句前解析错误
错误原因:语法错误
解析:通常是编译器遇到了未期望的输入。如:不合语法的字符串序列。此错
误也可能因为丢失花括号、园括号或分号,或写了非法的保留字而引发。
#include <stdio.h>
int main (void){
4
printf ("Hello ") /* 丢失分号 */
printf ("World!/n");
return 0;
}
conflicting types for ‘Alex‘
中文含义:对 ‘Alex‘ 变量存在突出类型
错误原因:前面可能已对 ‘Alex‘ 声明了其它数据类型。例如:存在两条语句
分别声明了两次‘Alex‘变量为两种枚举 (enum) 类型。
two or more data types indeclaration specifiers
中文含义:在声明标识符中存在多种数据类型
最容易出现这样的错误,原因是在程序里少了个“;”号。有可能在头文件里,
也有可能在本文件中(最容易出错的是在结构体中忘了“;”)。
too many types in declaration
中文含义:在声明中定义太多的类型
1.是否多次包含着个头文件?检查一下例如:
#ifndef TConfigH
#define TConfigH
#endif //是否少了这个
2.看下将长语句分为多行时,与下一行语句间是否少了逻辑运算符关系,关系运
算符之类的符号
warning: comparison between pointer and integer
中文含义:警告:对指针和整型值进行比较
可能没问题。此警告通常是由‘if (strstr(line,"word") != NULL )‘ 之类的strstr 函
数返回指针或空值。
subscripted value is neither array nor pointer
中文含义:下标值不符合数组或指针要求
错误原因:企图使用可变的变量作为下标
floppyto.c:782: parse error at end of input
中文含义:在文件尾部解析错误
floppyto.c 是程序文件名, 782 是错误行数,但该数字大于文件长度。错误原因:
存在没配对的花括号{}或注解 /* */
#include <stdio.h>
int main (void) {
if (1) {
5
printf ("Hello World!/n");
return 0; /* 花括号不匹配 */
}
parse error before ‘printf‘
中文含义:在‘printf‘ 之前解析错误
错误原因:在该语句之前缺少分号 ‘;‘
warning: implicit declaration of function ‘...‘
中文含义:警告:与函数 XXX 的隐式声明不相符
错误原因:该错误是因为使用的函数没有原型声明而产生。产生的因为可以是
导入错误的头文件,或忘记提供函数原型。如:
int main (void){
printf ("Hello World!/n"); /* 没有头文件 */
return 0;
}
程序中没有导入系统头文件’stdio.h’,所以也就不存在 printf 的原型声
明。改正方法:在程序最前面加入一行语句: #include <stdio.h>。
unterminated string or character constant
中文含义:未终止的字符串或字符常量
错误原因:该错误是因为使用字符串或字符常量缺少配对的引号而产生。对字
符而言,应使用成对的单引号,而对字符串,应使用成对的双引号。
#include <stdio.h>
int main (void){
printf ("Hello World!/n); /* 缺少闭双引号*/
return 0;
}
character constant too long
中文含义:字符常量太长
错误原因:在 C 和C++中,字符常量是由单引号封装起来的单个字符,并且
有相应的ASCII 值。如 ‘a‘ 对应的ASCII 为67, 而 ‘/n‘ 对应的ASCII 为10。本错
误是因为使用单引号封装了多于一个字符而引发。如:
#include <stdio.h>
int main (void){
printf (‘Hello World!/n‘); /* 错误的封装 */
return 0;
}
多字符组成的是字符串,应用双引号封装。对上例,应改写成: "Hello World!"。
6
warning: initialization makes integer from pointer without a
cast
中文含义:警告:初始化过程中不能从指针到整型数进行转换
错误原因:该错误指示在整型数环境中误用了指针。从技术上,可以在指针和
整型数之间相互转换,但这很少用在外部系统级应用程序中。通常,此类警告是在
使用了指针而没有释放该指针而引发。(如语句写成int i = p 而不是int i =
*p,其中p 是指针)。该警告在类型char 和char *之间转换时也可能引发,因
为char 也是整数类型。
int main (void){
char c = "/n"; /* 不正确 */
return 0;
}
变量 c 是 char 类型,而 "/n" 是字符串且会被系统认为是 const char * 指针
(将占用 2-字节内存,包括 ‘/0‘,因为字符串没有终止符)。类似的错误也会发生在
对宏 NULL 的误用:
#include <stdlib.h>
int main (void){
int i = NULL; /* 不正确 */
return 0;
}
在C 的‘stdlib.h’中,宏 NULL 被定义为 ((void *)0) ,它只能用在指针环境中。
dereferencing pointer to incomplete type
中文含义:间接引用指针为不合适的类型
错误原因:程序试图通过指针访问一个没有事先声明的结构体内元素。在C
和C++中,在声明指向结构的指针时,应先声明结构体。
struct btree * data;
int main (void){
data->size = 0; /* 不合适的类型 */
return 0;
}
此程序使用 btree 结构 data 的前向声明。然而,在指针间接独立访问内存前,
需要定义该结构。
warning: unknown escape sequence ‘...‘
中文含义:警告:未知的转义序列
错误原因:使用了不正确的转义字符。合法的转义字符序列如下:
/n 新行 /t 制表符
/b 回退 /r 回车
/f 换页 /v 垂直制表
7
/a 警告 (铃声)
组合字符 //, /‘, /" 和 /? 表示相应的独立字符。转义序列也可用八进制码
/0--/377 和十六进制码 /0x00--/0xFF 来表示。
#include <stdio.h>
int main (void){
printf ("HELLO WORLD!/N"); /* /N 错误 */
return 0;
}
warning: suggest parentheses around assignment used as truth
value
中文含义:警告:建议用圆括号括上用于逻辑值的赋值表达式
错误原因:该警告强调潜在的语义错误,程序在条件语句或其它逻辑表达式测
试中使用了赋值操作符 ‘=’ 而不是比较操作符 ‘= =’ 。当然在语法上,赋值操作符
可作为逻辑值使用,但在实践中很少用。
#include <stdio.h>
int main (void){
int i = 0;
if (i = 1) { /* = 应该是 == */
printf ("unexpected result/n");
}
return 0;
}
warning: control reaches end of non-void function
中文含义:警告:控制到达非void 函数末端。
错误原因:若一个函数已声明为有返回数据类型(如int 或double),那么就必
须在函数中的适当位置(所有可能的结束点)使用return 语句返回相应类型的值。
否则,就属于不是良好定义的函数。若函数声明为void,则不需要return 语句。
#include <stdio.h>
int display (const char * str){
printf ("%s/n", str);
}
以上程序在 display 函数的尾部没有返回语句,但它又声明为返回 int 类
型。可以通过添加 return 0; 之类的语句加以解决。当使用 gcc 时,C 程序中
的 main 函数必须返回一个 int 型数据(用于表明程序的退出状态)。
warning: unused variable ‘...‘
中文含义:警告:存在从未使用的变量 XXX。
warning: unused parameter ‘...‘
中文含义:警告:存在从未使用的参数 XXX。
8
错误原因:该警告指示存在已声明为局部的变量或函数参数,但在其它地方并
没使用过它。没使用过的变量可能会导致程序性错误,如偶尔在预期的位置上写了
不同的变量名。
int foo (int k, char * p){
int i, j;
j = k;
return j;
}
在本程序中,变量 i 和参数 p 从没使用过。
warning: passing arg of ... as ... due to prototype
中文含义:警告:传送 XX 参数为XXX,但原型不匹配。
错误原因:该警告指示在调用函数时,存在与声明的参数类型原型不一致的情
况。
warning: passing arg 1 of ‘cpystr‘ makes integer from pointer
中文含义:警告:函数的参数1 存在参数不匹配,即无法进行类型转换
错误原因:类型转换不匹配
下面的样例就存在这方面的问题:
void cpystr( char item);
main(){
char src[]="martin leslie";
cpystr(src);
}
cpystr(char item){ }
函数应该写成如下类似的格式:
void cpystr( char item[]);
main(){
char src[]="martin leslie";
cpystr(src);
}
cpystr(char item[]){ }
warning: assignment of read-only location
中文含义:警告:对只读变量进行赋值。
错误原因:检查赋值的变量是否已用 const 修饰或已被声明为常量。
warning: cast discards qualifiers from pointer target type
中文含义:警告:在指针目标类型中存在不合适的转换限定符。
9
warning: assignment discards qualifiers ...
中文含义:警告:赋值丢弃限定符 XXX。
warning: initialization discards qualifiers ...
中文含义:警告:初始化丢弃限定符 XXX。
warning: return discards qualifiers ...
中文含义:警告:返回值丢弃限定符 XXX。
错误原因:对指针的不正确使用了违法的限定符。检查赋值的变量是否已用
const 修饰或已被声明为常量。若指针被限制为 const 则该指针不能被修改,且
只能被用于向其它指针赋值。
char *f (const char *s){
*s = ‘/0‘; /* 向只读数据赋值 */
return s; /* 将会丢弃常量,即并不能被返回 */
}
该程序试图修改常量数据,并在返回值中使用常量属性参数而导致丢弃。
initializer element is not a constant
中文含义:初始化元素不是常量。
错误原因:在C 中,全局变量只能在初始化是赋值常量,如数值、NULL 或字
符串常量。若使用了非常量值则会引发此错误。
#include <stdio.h>
FILE *stream = stdout; /* 不是常量 */
int i = 10;
int j = 2 * i; /* 不是常量 */
int main (void){
fprintf (stream, "Hello World!/n");
return 0;
}
注意:在C++中则允许在初始化中使用非常量数据。
3、链接时的错误信息
file not recognized: File format not recognized
中文含义:文件不可识别:文件格式不可识别。
错误原因:文件扩展名不是 ‘.c’。
#include <stdio.h>
int main (void){
printf ("Hello World!/n");
return 0;
}
若上述文件保存为 ‘hello’ 但没有扩展名,则编译时会给出如下错误:
10
$ gcc -Wall hello
hello: file not recognized: File format not
recognized
collect2: ld returned 1 exit status
解决方案是将文件重命名为带合适的扩展名。对本例可重命名为 ‘hello.c’.
undefined reference to ‘foo‘
collect2: ld returned 1 exit status
中文含义:没定义对‘foo‘ 的引用。
错误原因:程序中使用了在本文件和其它库中没有定义的函数或变量。有可
能是丢失了链接库,或使用了不正确的名字。
在此例中,’collect2’ 是链接程序的一部分。
int foo(void);
int main (void){
foo();
return 0;
}
/usr/lib/crt1.o(.text+0x18): undefined reference to ‘main‘
中文含义:没定义对main 函数的引用
错误原因:程序中缺少 main()函数。
/usr/lib/crt0.o: Undefined symbol _main referenced from text
segment
中文含义:从文本段引用没定义的_main 符号
错误原因:缺少 main()函数—但实际上有,为什么?
1.在头文件中可能存在语法错误;
2.在C 源文件中可能缺少gcc 命令
Undefined symbol _initscr referenced from text segment
中文含义:从文本段引用没定义的_initscr 符号
错误原因:调用了一个函数,但并没有该函数,或在#include 语句中没有包含
该函数的库。
4、运行时的错误信息
error while loading shared libraries:
cannot open shared object file: No such file or directory
中文含义:装载共享库是出错:
不能打开共享对象文件:不存在该文件或目录
11
错误原因:程序中使用了共享库,但程序启动时通过动态链接找不到所需的共
享库文件。如果确定存在,则请修改共享类库搜索路径变量值LD_LIBRARY_PATH。
Segmentation fault
中文含义:分段错误,总线错误
错误原因:企图访问受保护的内容或覆盖重要的数据! 它指明内存访问错误。
通常的原因如下:
1、反向引用一个空指针或没初始化的指针;
2、超出数组访问的下标;
3、对 malloc, free 和相关函数不正确的使用;
4、使用 scanf 时的参数(数量、类型)不正确。
floating point exception
中文含义:浮点运算异常
错误原因:这是个算术运算异常。如除数为0,上溢、下溢或非法的操作(如
对-1 求平方根)。
Illegal instruction
中文含义:非法指令
错误原因:当系统遇到非法的机器指令时,产生此错误。通常此类错误是在源
代码已编译成特定机器的目标代码后,又在其它类型的机器上运行时发生。

时间: 2024-10-17 16:47:17

GCC 常见错误解析的相关文章

WSL下使用VcXsrv启动chromium browser及常见错误解析 (ubuntu18.04, 图形界面)

先说结论,解决方法在最后: 启动浏览器实质是启动图形界面,推广到其他GUI程序同样适用. 目前在WSL环境下通过VcXsrv这个X server启动图形界面相对简单,但仍存在兼容性问题,配置仍需完善. 环境: win10系统安装ubuntu18.04的命令行工具(通过Microsoft Store安装) 背景: 正在阅读headfirst C(即嗨翻C语言)的P445,涉及以下关于不同系统启动特定浏览器的代码,用于启动特定浏览器: void open_url(char *url) { char

Spring AOP常见错误解析

Spring 3.0以后的版本相比于2时代的版本一个重要的变化就是aop所依赖的jar包没有一起发布,需要自己单独下载. Spring AOP部分使用JDK动态代理或者CGLIB来为目标对象创建代理.如果被代理的目标实现了至少一个接口,则会使用JDK动态代理,如果用JDK动态代理,就必须为被代理的目标实现一个接口(要注意的地方是:需要将ctx.getBean()方法的返回值用接口类型接收):.所有该目标类型实现的接口都将被代理.若该目标对象没有实现任何接口,则创建一个CGLIB代理,如果使用CG

laravel常见错误解析

Syntax error or access violation: 1055 sql_mode设置导致的问题, 修改 config/database.php配置 strict => false 'mysql' => [ 'driver' => 'mysql', 'host' => env('DB_HOST', 'localhost'), 'port' => env('DB_PORT', '3306'), 'database' => env('DB_DATABASE',

MySQL主从多种架构部署及常见错误问题解析

本文的主要内容有mysql复制原理,mysql一主多从.双主架构的示例解读,以及mysql在主从复制架构实践中的常见错误问题和解决方法. 一 mysql复制原理 1 原理解读 mysql的复制(replication)是异步复制,即从一个mysql实列或端口(Master)复制到另一个mysql实列的或端口(slave):复制操作由3个进程完成,其中2个(SQL进程和I/O进程)在Slave上,另一个在Master上:要实现复制,必须打开Master端的二进制日志(log-bin),log-bi

GlusterFS源码解析—— GlusterFS 命令行常见错误

问题1 [[email protected] ~]# gluster peer status Connection failed. Please check if gluster daemon is operational. 原因:未开启glusterd服务 解决方法:开启glusterd服务 /etc/init.d/glusterd start 问题2 [[email protected] ~]# gluster peer probe server-130 peer probe: failed

Servlet的Service方法和doget 和 dopost方法的区别,常见的错误解析

package com.sxt.in; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * Service方法和doget 和 dopost方

手机APP游戏开发中常见的5个错误解析

一款手机游戏的成功,和其开发过程有着密切的关系,在任何一个开发过程中出现的错误,都会影响游戏以后的发展.那么我们在手机游戏的开发过程中常见的错误有哪些呢?我们又该如何避免这个情况的发生呢?一起来看看吧. 忽略目标群体 手机游戏开发首先就要确定所针对的目标群体,游戏主要是为谁而做?这些目标群体的关注点是什么?什么类型的游戏活动他们比较感兴趣?这些目标群体能投资多少在游戏的花费上?是否都每天都有娱乐游戏的时间.这就是开发游戏前期需要的市场调查,明确游戏人群,对于手机游戏后期的策划以及推广方向都有很大

coreseek常见错误原因及解决方法

coreseek常见错误原因及解决方法 Coreseek 中文全文检索引擎 Coreseek 是一款中文全文检索/搜索软件,以GPLv2许可协议开源发布,基于Sphinx研发并独立发布,专攻中文搜索和信息处理领域,适用于行业/垂直搜索.论坛/站内搜索.数据库搜索.文档/文献检索.信息检索.数据挖掘等应用场景,用户可以免费下载使用 本文为大家整理了coreseek/sphinx中文检索引擎的常见问题和解决方法,感兴趣的同学参考下. Coreseek 是一款中文全文检索/搜索软件,以GPLv2许可协

Python程序的常见错误(收集篇)

关于Python Python是一门解释性的,面向对象的,并具有动态语义的高级编程语言.它高级的内置数据结构,结合其动态类型和动态绑定的特性,使得它在快速应用程序开发(Rapid Application Development)中颇为受欢迎,同时Python还能作为脚本语言或者胶水语言讲现成的组件或者服务结合起来.Python支持模块(modules)和包(packages),所以也鼓励程序的模块化以及代码重用. 关于本文 Python简单.易学的语法可能会误导一些Python程序员(特别是那些