最近在分析trimaran代码,所以常常需要在linux上用gcc编译代码,期间出现了好多次错误提示,就在这把这些错误给记录下落,以防重蹈覆徹啦!
1)storage class specified for parameter
检查过后发现头文件的一个函数声明后面忘加分号了,汗一个~~~~
所以以后出现这种错误,就检查错误之间所有的代码和被包含的文件里是否出现这种错误就ok啦。
2)‘for' loop initial declaration used outside C99 mode
我在for 循环的初始化部分声明了变量,因为C89和C94不支持for循环变量i在循环内定义,但C99支持 所以你上面这样写只有C99支持,如果你编译的时候std=c99,编译器就不会报上面的错误。所以两种解决方案:
解决方法一:
把声明提出来就好了
解决方法二:
加上-std=c99参数
即gcc -std=c99 -o hello hellolinux.c
3)undefined reference to
这种错误好像是在某个符号不能确定在哪定义而产生的,,所以能很可能是少了个头文件,要么就是该链接的.a或.o找不到,如果有的话那就是版本不对。
不过我这次出现的问题是在头文件里定义了某个类型,而在相应的.c文件中声明该类型变量时还加了个extern,直接导致链接时无法找到该符号的定义。
4)段错误,Program received signal SIGSEGV, Segmentation fault.
这个问题呢,我还么解决。跑的程序如下:
1)storage class specified for parameter
检查过后发现头文件的一个函数声明后面忘加分号了,汗一个~~~~
所以以后出现这种错误,就检查错误之间所有的代码和被包含的文件里是否出现这种错误就ok啦。
2)‘for' loop initial declaration used outside C99 mode
我在for 循环的初始化部分声明了变量,因为C89和C94不支持for循环变量i在循环内定义,但C99支持 所以你上面这样写只有C99支持,如果你编译的时候std=c99,编译器就不会报上面的错误。所以两种解决方案:
解决方法一:
把声明提出来就好了
解决方法二:
加上-std=c99参数
即gcc -std=c99 -o hello hellolinux.c
3)undefined reference to
这种错误好像是在某个符号不能确定在哪定义而产生的,,所以能很可能是少了个头文件,要么就是该链接的.a或.o找不到,如果有的话那就是版本不对。
不过我这次出现的问题是在头文件里定义了某个类型,而在相应的.c文件中声明该类型变量时还加了个extern,直接导致链接时无法找到该符号的定义。
4)段错误,Program received signal SIGSEGV, Segmentation fault.
这个问题呢,我还么解决。跑的程序如下:
/ sample1.c
#include<stdio.h>
int a=4,b;
int fun(int x)
{
x++;
printf("%d/n",x);
return x;
}
int main()
{
int c[2];
b=fun(a);
printf("This is ok!");
c[0]=a;
c[1]=b;
return 1;
}
用gcc直接编译没问题,但是用trimran的tcc命令之后生成的可执行文件运行时就报段错误了,这个trimran还是用的静态链接,我还么发用gdb调试,很挫败呀,不知道这个小代码中有什么隐藏的问题,谁来解答下呢!
#include<stdio.h>
int a=4,b;
int fun(int x)
{
x++;
printf("%d/n",x);
return x;
}
int main()
{
int c[2];
b=fun(a);
printf("This is ok!");
c[0]=a;
c[1]=b;
return 1;
}
用gcc直接编译没问题,但是用trimran的tcc命令之后生成的可执行文件运行时就报段错误了,这个trimran还是用的静态链接,我还么发用gdb调试,很挫败呀,不知道这个小代码中有什么隐藏的问题,谁来解答下呢!