程序中引入库文件的头文件 编译时并不需要显示的用gcc去链接他的库文件 why?
2013-07-06 10:55
316 查看
拿一个苹果系统下的c文件为例:
当我们编译的时候 一般使用 gcc testArray.c 编译出来一个名为a.out的可执行文件,但是文件中我们引入
了<stdio.h>,为什么不需要显示的用gcc去链接这个库文件呢?原来当用gcc编译的时候会调用ld去链接库
文件,先把testArray.c编译成一个目标文件,再用ld命令去链接,看看发生了生么。
首先
gcc -c testArr.c
会生成一个testArr.o的目标文件
接下来进行目标文件的链接
ld testArr.o
会出现错误信息:
提示的错误信息表示目标文件在链接的时候没有找到main函数中的printf函数,printf函数是库文件中的函数,所以连接器没有找到库文件进行链接。
这时候我们需要显示的让它链接库文件
ld testArr.o -lc
但还是会出一些提示信息
我们会发现系统提示没有找到系统的start入口,接下来
ld testArr.o -lc -macosx_version_min 10.8
会发现终于没有错误和警告信息了。
结论:使用gcc不需要显示的链接是因为内部编译器自动的干了这些事情,当我们自己一步步来做这些事情的时候,就会发现该有的步骤还是会有。
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不需要显示的链接是因为内部编译器自动的干了这些事情,当我们自己一步步来做这些事情的时候,就会发现该有的步骤还是会有。
相关文章推荐
- GCC 显示程序详细编译-链接过程
- 1.2.在linux环境实践,使用vim编写一个程序,然后使用gcc查看【预处理】、【编译】、【汇编】、【链接】各阶段文件的内容。并熟悉相关指令。
- Linux操作系统的简单指令及如何使用vim编写一个程序,然后使用gcc查看【预处理】、【编译】、【汇编】、【链接】各阶段文件的内容。
- gcc程序编译时添加头文件和库文件时需注意的一个地方
- 抽取VS文件组成类GCC的编译器,并编译C程序为dll动态链接库
- C语言程序经过编译链接后形成二进制映像文件的组成
- GCC 编译动态库 so文件时,静态链接libmysqlclient.a 与动态链接参数一起使用问题。
- Gcc编译 之外链接头文件&Lib库
- EWARM IAR5.4编译链接过程, 程序运行阶段, ICF ilink配置文件
- [转]gcc下程序调用静态库编译命令:主文件必须在静态库前面!
- 在程序编译的时候,头文件不参与编译,源文件单独编译(VC),但编译源文件时,会展开其包含的头文件
- 程序编译、链接、运行时头文件或动态链接库的查找
- 用mingw编译C++工程;程序里面的cout<<"aaa";cmd运行c++程序,aaa内容在控制台不显示,如何将aaa输出到控制台屏幕并将控制台内容写到一个文件中。
- Visual C++ 工程文件显示红杠杠且编译或链接不过原因
- eclipse下添加GCC编译器的编译链接库以及程序运行参数方法
- 代码文件-预编译-编译-汇编-链接-可执行程序
- 菜鸟攻略–C语言多文件编程初探(二):使用 gcc 手动编译多文件 C 程序
- eclipse下添加GCC编译器的编译链接库以及程序运行参数方法
- ROS知识(16)----如何编译时自动链接同一个工作空间的其他包的头文件(包含message,srv,action自动生成的头文件)
- gcc 4.8.4编译链接后的可执行文件在gcc5.4.0出现symbol lookup error