在windows下写程序的时候,通常我们所说的“编译”程序,就是直接点IDE工具上的那个运行图标,程序就运行起来了。 所以windows下开发的时候很少对程序编译的整个过程有大概的了解,对编译和链接理解的不是很透彻(至少我当初是这样的),每当看到编译器报错的时候,心就开始方了,不能迅速找出问题所在。
在Linux写程序,可以大大加强我们在这方面的能力,深刻理解了编译和链接的意思,可以使我们快速看明白编译器报的错,因此,有必要花点时间稍微理解一下,下面我们就从一个简单的例子入手,理解一下编译和链接:
回顾一下上节,我们使用gcc将hello.c编译成hello的命令:gcc -o hello hello.c。
这条命令就是将hello.c先编译再链接成一个可执行程序。
下面我们写个简单的例子,将编译和链接分开:
首先写一个main.c,如何新建文件请查阅上文,
main.c内容如下:
void myfunction(); int main() { myfunction(); //执行一个函数 return 0; }
main函数非常简单,就是执行了一个myfunction函数。
现在我们把它编译成main.o中间文件,命令为:
gcc -c main.c
执行完毕 便可以看到顺利生成了一个main.o文件,这是一个中间文件,就类似windows上的.obj文件。
细心的朋友会发现,上面我们只是声明了一个myfunction函数,函数是没有实现的。
现在我们尝试去链接它,看看会发生什么。
链接的命令为:
gcc -o hello main.o
执行后结果如下:
可以看到,我们期望的 myfunction函数未定义终于出现了。
这就是链接错误。
下面我们继续新建一个function.c文件,文件内容如下:
#include <stdio.h> void myfunction() { printf("this is %s ",__FUNCTION__); }
代码很简单,就是打印了函数名字。
继续使用gcc编译:
gcc -c function.c
执行完毕 便可以看到顺利生成了一个function.o文件,这同样是一个中间文件。
现在,继续将上面生成的main.o和function.o链接成可执行程序,命令如下:
gcc -o hello main.o function.o
执行完毕,便生成了一个hello文件,这是一个可执行文件,可以直接运行:
到此,可以完美谢幕了!
只要理解了这个简单的例子,便能掌握编译和链接的本质了。
请牢记一句话:磨刀不误砍柴工!
学习音视频技术欢迎访问 http://blog.yundiantech.com
音视频技术交流讨论欢迎加 QQ群 121376426