1. gcc与g++
gcc与g++分别是c语言与c++代码的编译器,但同时g++也兼容c语言。
我们知道在Linux中,系统并不以文件后缀来区分文件类别。但对于gcc与g++等编译器而言却是需要的。Linux中c代码文件的后缀是.c,c++代码文件的后缀是.cpp(.cc)(.cxx)。
在Linux中,我们可以借助如下命令查询gcc/g++的版本
gcc --version
g++ --version
如果我们查询失败,显示系统中没有gcc/g++,那么我们可以借助yum工具来进行安装。
yum -y install gcc
yum -y install gcc-c++
这里要注意,gcc只能编译c语言代码,而g++同时兼容c/c++。-o选项可以指定生成可执行文件的名字。
实例:
2.程序的翻译过程
一张图表示程序的翻译过程
在上图中,其他的都很好理解,那么链接是谁和谁链接呢?
链接是我们的程序同库之间链接的过程,ldd+可执行程序名,就可以查看程序依赖的库。
怎么做的?
在Linux系统中,分为两种库,动态库:.so 静态库:.a(动态链接,静态链接)
静态链接
特点:在生成可执行文件的时候(链接阶段),把所有需要的函数的二进制代码都包含到可执行文件中去。因此,链接器需要知道参与链接的目标文件需要哪些函数,同时也要知道每个目标文件都能提供什么函数,这样链接器才能知道是不是每个目标文件所需要的函数都能正确地链接。如果某个目标文件需要的函数在参与链接的目标文件中找不到的话,链接器就报错了。目标文件中有两个重要的接口来提供这些信息:一个是符号表,另外一个是重定位表。
优点:在程序发布的时候就不需要的依赖库,也就是不再需要带着库一块发布,程序可以独立执行。
缺点:程序体积会相对大一些。
如果静态库有更新的话,所有可执行文件都得重新链接才能用上新的静态库。
动态链接
特点: 在编译的时候不直接拷贝可执行代码,而是通过记录一系列符号和参数,在程序运行或加载时将这些信息传递给操作系统,操作系统负责将需要的动态库加载到内存中,然后程序在运行到指定的代码时,去共享执行内存中已经加载的动态库可执行代码,最终达到运行时连接的目的。
优点: 多个程序可以共享同一段代码,而不需要在磁盘上存储多个拷贝。
缺点: 由于是运行时加载,可能会影响程序的前期执行性能。