您的位置:首页 > 其它

程序中引入库文件的头文件 编译时并不需要显示的用gcc去链接他的库文件 why?

2013-07-06 10:55 316 查看
拿一个苹果系统下的c文件为例:

testArr.c
1 #include <stdio.h>
2
3 int main()
4 {
5         int a[] = {1, 2, 3, 4, 5};
6         printf("%d\n", a[3]);
7 }


当我们编译的时候 一般使用 gcc testArray.c 编译出来一个名为a.out的可执行文件,但是文件中我们引入

了<stdio.h>,为什么不需要显示的用gcc去链接这个库文件呢?原来当用gcc编译的时候会调用ld去链接库

文件,先把testArray.c编译成一个目标文件,再用ld命令去链接,看看发生了生么。

首先

gcc -c testArr.c

会生成一个testArr.o的目标文件

接下来进行目标文件的链接

ld testArr.o

会出现错误信息:

ld: warning: -macosx_version_min not specified, assuming 10.7
Undefined symbols for architecture x86_64:
"_printf", referenced from:
_main in testArr.o
"start", referenced from:
implicit entry/start for main executable
ld: symbol(s) not found for inferred architecture x86_64


提示的错误信息表示目标文件在链接的时候没有找到main函数中的printf函数,printf函数是库文件中的函数,所以连接器没有找到库文件进行链接。

这时候我们需要显示的让它链接库文件

ld testArr.o -lc

但还是会出一些提示信息

ld: warning: -macosx_version_min not specified, assuming 10.7
Undefined symbols for architecture x86_64:
"start", referenced from:
implicit entry/start for main executable
ld: symbol(s) not found for inferred architecture x86_64


我们会发现系统提示没有找到系统的start入口,接下来

ld testArr.o -lc -macosx_version_min 10.8

会发现终于没有错误和警告信息了。

结论:使用gcc不需要显示的链接是因为内部编译器自动的干了这些事情,当我们自己一步步来做这些事情的时候,就会发现该有的步骤还是会有。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐