gcc实际上是个工具链,在编译程序的过程中调用不同的工具。
汇编器生成的是可重定位的目标文件,学过操作系统,我们知道,在源程序中地址是从0开始的,
这是一个相对地址,而程序真正在内存中运行时的地址肯定不是从0开始的,而且在编写源代码的时候也不能知道程序的绝对地址,
所以重定位能够将源代码的代码、变量等定位为内存具体地址。
使用外部库:
库文件是一些预先编译好的函数集合,那些函数都是按照可重用原则编写的。
静态库(.a):程序在编译链接的时候把库的代码链接到可执行文件中。程序运行的时候将不再需要静态库。
静态库比较占用磁盘空间,而且程序不可以共享静态库。
运行时也是比较占内存的,因为每个程序都包含了一份静态库。
动态库(.so或.sa):程序在运行的时候才去链接共享库的代码,多个程序共享使用库的代码,这样就减少了程序的体积。
一般头文件或库文件的位置在://系统默认的路径
/usr/include及其子目录底下的include文件夹
/usr/local/include及其子目录底下的include文件夹
/usr/lib
/usr/local/lib
/lib
库的搜索路径遵循几个搜索原则:
从左到右搜索-I -l指定的目录,如果在这些目录中找不到,那么gcc会从由环境 变量指定的目录进行查找。
头文件的环境变量是C_INCLUDE_PATH,库的环境变量是LIBRARY_PATH.如果还是找不到,那么会从系统指定指定的目录进行搜索。
Linux编译工具:gcc入门:
https://cloud.tencent.com/developer/article/1155127
====================================================
GCC/G++会查找系统默认的include和link的路径,以及自己在编译命令中指定的路径。
编译链接时,
首先会去指定的搜索路径中寻找库和头文件;
没找到的话,去环境变量中指定的地方去寻找;//LIBRARY_PATH C_INCLUDE_PATH,CPLUS_INCLUDE_PATH,OBJC_INCLUDE_PATH
最后再去系统默认的路径去寻找;
linux gcc 编译时头文件和库文件搜索路径:
https://www.cnblogs.com/lidabo/p/4950785.html
linux下gcc默认搜索头文件及库文件的路径:
https://blog.csdn.net/jingsihu/article/details/69389510
====================================================
原文:https://www.cnblogs.com/grooovvve/p/12846777.html