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

拿一个苹果系统下的c文件为例:

testArr.c
  1 #include <stdio.h>
  2 
  3 int main()
  4 {
  5         int a[] = {1, 2, 3, 4, 5};
  6         printf("%d
", 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不需要显示的链接是因为内部编译器自动的干了这些事情,当我们自己一步步来做这些事情的时候,就会发现该有的步骤还是会有。

终于明白,“喜欢”是一种莫大的能量!
原文地址:https://www.cnblogs.com/tml839720759/p/3174894.html