gcc链接阶段
来源:互联网 发布:网络传播营销策划案 编辑:程序博客网 时间:2024/06/08 14:04
gcc链接阶段(link time)
此阶段,告诉编译器,在哪里找到库文件?以静态还是动态的方式链接库文件?默认情况下使用动态方式链接,这要求存在对应的.so动态库文件,如果不存在,则寻找相应的.a静态库文件。
若在编译时向gcc传入-static选项,则使用静态方式链接,这要求所有库文件都必须有对应的*.a静态库。
那么,是否可以令某些库使用动态链接,另一些库使用静态链接?不太确定,请参考ld的使用手册,我没有这样用过。
在链接阶段,gcc编译器如何寻找库文件呢(linker本身并没有默认的查找路径,这些查找路径是由gcc传递给linker的)
大家可以在编译时,向gcc加入-v选项来观察它向linker传递的库文件查找路径(观察LIBRARY_PATH变量的值),通常查找路径如下:
任何由-rpath-link或-rpath选项指定的目录
LD_RUN_PATH(如果没有找到-rpath或-rpath-link选项)
-Ldir1 -Ldir2 ...
/usr/lib/gcc///
/usr/lib/
第一行-rpath-link与-rpath选项的区别在于,-rpath选项指定的目录被硬编码到可执行文件中,-rpath-link选项指定的目录只在链接阶段生效。由于这两个选项都是链接器ld的选项,如何从gcc中向ld传递这两个选项?方法如下(更从细节参考gcc的-Wl选项):
gcc -Wl, -rpath, /usr/local/lib
这相当于向ld向传递了如下参数:
ld -rpath /usr/local/lib
第二行,如果没有设置-rpath或-rpath-link选项,则查找LD_RUN_PATH环境变量指定的目录,并把它当作-rpath选项来处理。第三行-Ldir1 -Ldir2 ...,是我们通过gcc的-L选项向其指定的库文件查找路径,查找顺序按照我们传递的-L参数从左到右进行搜索;第四行属于gcc自己的库目录;第五行/usr/lib/是Linux系统默认的系统库文件的目录。第四、第五行,都是gcc自动向linker传递的查找目录。例如我现在的机器上,使用gcc -v可以看到LIBRARY_PATH变量值为:
LIBRARY_PATH=/usr/lib/gcc/i686-redhat-linux/4.5.1/:/usr/lib/
但是这并不是全部真理!根据我自己的测试,我发现gcc会把/usr/local/lib/目录也作为链接阶段的查找路径,这正是问题的根源——我们在链接过程中,使用到了/usr/local/lib/里面的一些库文件,但在运行时阶段,却说找不到该库文件。
- gcc链接阶段
- gcc编译程序的四个阶段(预处理-编译-汇编-链接)
- 拆解GCC命令的预处理-编译-汇编-链接4个阶段
- 拆解GCC命令的预处理-编译-汇编-链接4个阶段
- gcc编译几个阶段
- gcc 编译四个阶段
- gcc 编译阶段
- gcc的三个阶段
- gcc预处理阶段
- gcc链接
- 9.链接阶段
- gcc编译的四阶段
- GCC编译的四个阶段
- GCC编译的四个阶段
- gcc编译之 编译阶段
- GCC编译的四个阶段
- GCC编译过程四个阶段
- gcc 动态链接库
- mina两种协议获取方式(TCP/UDP)
- hive 表修改字段类型
- html5移动端input file可进行拍照和选择图片
- [学习linux]Ubuntu kylin 16.04下安装mysql 问题及总结
- 内存操作
- gcc链接阶段
- (转)ProgressDialog使用总结
- CSV常用命令
- 13 明白了这点才能拿高薪
- Kotlin语法(八)-方法和lambda表达式
- leetcode.476. Number Complement
- 删除作业,执行带参作业
- HeadZoomScrollView下拉放大的图片松开回弹
- Qt 自定义 滚动条 样式