第二个问题是关于makefie的。众所周知,使用makefile可以对多个源文件进行编译,非常的方便简捷。但是在学习的过程中我遇到了一些小问题。我不明白使用makefile和在main函数所在的文件直接incldue其它文件的区别。
于是在使用中我自己创建了几个小文件,便搞懂了这个问题。
首先先举两个例子
file1.c:
#include "stdio.h" void main() { int a; printf("please input the number:\n"); scanf("%d",&a); printf("square(a)=%d\n",square(a)); }
file2.c:
#include "stdio.h" int square(int x) { return x*x; }
makefile文件
第二个例子:
file1.c
#include<stdio.h>
#include"file2.c"
int g=3;
int main(void)
{
int s,y;
s=g*g*g;
y=sum(g,s);
printf("%d%d\n",s,y);
}
file2.c
#include<stdio.h>
int sum(int e,int f)
{
return e+f;
}
相同如果仍然用上面的makefile文件,便不会运行成功程序会报错说:
gcc -cfile1.c
gcc file1.o file2.o -o file12
file2.o:在函数‘sum’中:
file2.c:(.text+0x0): multiple definition of `sum'
file1.o:file1.c:(.text+0x0):第一次在此定义
collect2: 错误:ld 返回 1
make: *** [file12] 错误 1
在查找了一些关于C语言编译的知识后,我终于解决了这个问题。
最重要是要明白一点:只要是一个c语言源文件,不管在代码中是否存在错误都可以生成目标文件。
在linux上编写程序时,可以使用makefile来完成一个工程的编译,并且需要分为多步。
首先我们将相关功能的函数组织在一个文件中形成属于项目的函数库,然后我们把每个文件gcc-c编译为独立的.o目标文件,最后统一
链接生成可执行文件。
如果不使用makefile的话,就需要对主函数存在的文件开头中加上include所调用函数所在的文件,这样才能使编译不报错。
而在例二中,使用make命令后就已经对该文件进行了链接,所以在文件开头处不用incldue其他的文件,否则将是重复的定义。
当然也可以在源文件加入其他头文件进行编译,不过需要在编写makefile文件时同时把.h文件加入到编译语句中。