您的位置:首页 > 运维架构 > Linux

学习c语言遇到的一些问题(2)(Linux)(makefile)

2016-01-06 19:55 483 查看
第二个问题是关于makefie的。众所周知,使用makefile可以对多个源文件进行编译,非常的方便简捷。但是在学习的过程

中我遇到了一些小问题。使用makefile和在主函数所在的文件直接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

#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

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语言源文件,不管源代码中是不是存在错误都可以生成它对应的目标文件。

在linux上编写程序时,可以使用makefile来完成一个工程的编译。这时需要分为好几步。

通常我们将相关功能的函数组织在一个文件中形成属于项目的函数库,每个文件gcc-c编译为独立的.o目标文件,最后统一

链接生成可执行文件。

而正是在链接这一步起到了作用,即使在主函数所在文件中没有include其他文件,但是已经把各个文件链接在了一起,同样能够生成可执行文件。

如果不使用makefile的话,就需要对主函数存在的文件开头中加上include所调用函数所在的文件,这样才能使编译不报错。

而在例二中,使用make命令后就已经对该文件进行了链接,所以在文件开头处可以用再incldue其他的文件,否则将是重复

的定义。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: