拿一个苹果系统下的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
会出现错误信息:
1 ld: warning: -macosx_version_min not specified, assuming 10.7 2 Undefined symbols for architecture x86_64: 3 "_printf", referenced from: 4 _main in testArr.o 5 "start", referenced from: 6 implicit entry/start for main executable 7 ld: symbol(s) not found for inferred architecture x86_64
提示的错误信息表示目标文件在链接的时候没有找到main函数中的printf函数,printf函数是库文件中的函数,所以连接器没有找到库文件进行链接。
这时候我们需要显示的让它链接库文件
ld testArr.o -lc
但还是会出一些提示信息
1 ld: warning: -macosx_version_min not specified, assuming 10.7 2 Undefined symbols for architecture x86_64: 3 "start", referenced from: 4 implicit entry/start for main executable 5 ld: symbol(s) not found for inferred architecture x86_64
我们会发现系统提示没有找到系统的start入口,接下来
ld testArr.o -lc -macosx_version_min 10.8
会发现终于没有错误和警告信息了。
结论:使用gcc不需要显示的链接是因为内部编译器自动的干了这些事情,当我们自己一步步来做这些事情的时候,就会发现该有的步骤还是会有。