gcc/g++动态链接库和静态库的链接顺序
来源:互联网 发布:简单php发送post请求 编辑:程序博客网 时间:2024/05/16 10:22
so文件:动态库
a文件: 静态库
exe文件:可执行程序(linux下以文件属性来标示是否是可执行文件,与后缀名无关)
经过自己写的一些测试程序,大致了解了下gcc中链接顺序问题,总结出以下几点:
1,动态库中可以包含另一个静态库,通过参数 -lxxx 把静态库libxxx.a加入so文件中,这样so文件中
就包含了libxxx.a的所有实现。当然,如果不包含libxxx.a也没有问题,这样生成的so会小一点。
如果不包含libxxx.a,最终使用这个so的可执行文件,在其生成时必须加入 -lxxx。
2, 2个so文件可以包含同一个静态库libxxx.a,最终生成exe文件时,不会产生冲突。更广泛的说,生成
exe文件时候,可以链接多个so文件和a文件,如果其中的a文件有多份实现,最终只会有一份生效,其他都会被忽略。不用担心冲突。
3,当生成exe时候,当a文件有多份实现时,最左边指定的a文件才生效。
具体例子来说:
libstatic.a : 一个静态库文件
libdynamic1.so:需要使用libstatic.a中的函数,但是没有包含libstatic.a
libdynamic2.so:需要使用libstatic.a中的函数,包含libstatic.a
libdynamic3.so:需要使用libstatic.a中的函数,也包含libstatic.a
test.exe:最终的生成的可执行文件(linux对后缀没有要求,为了说明文件,姑且用exe后缀来表示可执行文件)
gcc -o test.exe -ldynamic1 :错误,libdynamic1.so中没有包含libstatic.a,找不到libstatic.a的实现。
gcc -o test.exe -ldynamic1 -lstatic:正确,so中没有,但是指定了libstatic.a,可以编译过
gcc -o test.exe -ldynamic2 :正确,libdynamic2.so中有libstatic.a的实现。
gcc -o test.exe -ldynamic1 -ldynamic2:正确,libdynamic1.so中没有libstatic.a,但是libdynamic2.so中有。
gcc -o test.exe -ldynamic2 -ldynamic3:正确,虽然libdynamic2.so和libdynamic3.so都含有静态库,但是不会冲突, 最终只会有一份存在,并且是libdynamic2.so中的静态库有效。
gcc -o test.exe -ldynamic2 -ldynamic3 -lstatic:同样正确,最终只会有一份存在,并且是libdynamic2.so中的静态库有效。
gcc中库的链接顺序是从右往左进行,所以要把最基础实现的库放在最后,这样左边的lib就可以调用右边的lib中的代码。同时,当一个函数的实现代码在多个lib都存在时,最左边的lib代码最后link,所以也将最终保存下来。
上一篇:(OK) 编译cBPM-android—CentOS 7—NDK8—androideabi-4.7—API14—3版
下一篇:(OK) 调试cBPM—CentOS7—gdb—gdbserver—问题的解决—3—段错误
- test123
- 编写安全代码——小心有符号数...
- 使用openssl api进行加密解密...
- 一段自己打印自己的c程序...
- sql relay的c++接口
- linux dhcp peizhi roc
- 关于Unix文件的软链接
- 求教这个命令什么意思,我是新...
- sed -e "/grep/d" 是什么意思...
- 谁能够帮我解决LINUX 2.6 10...
- gcc/g++动态链接库和静态库的链接顺序
- gcc中动态库和静态库的链接顺序
- gcc中动态库和静态库的链接顺序
- gcc中动态库和静态库的链接顺序
- gcc/g++ 静态动态库 混链接.
- gcc/g++ 静态动态库 混链接.
- gcc/g++ 静态动态库 混链接.
- gcc/g++ 动态 静态 链接库 so
- gcc链接g++编译生成的静态库和动态库的makefile示例
- GCC动态链接库和静态库
- gcc编译动态和静态链接库
- gcc编译动态和静态链接库
- GCC编译动态和静态链接库
- gcc编译动态和静态链接库
- GCC编译动态和静态链接库
- gcc编译动态和静态链接库
- gcc编译动态和静态链接库
- gcc编译动态和静态链接库
- (OK) 调试cBPM—CentOS7—gdb—gdbserver—问题的解决—2—段错误
- lightoj 1134 - Be Efficient DP 思路
- 从零开始用好ViewPager(1)
- (OK) 编译cBPM-android—CentOS 7—NDK8—androideabi-4.7—API14—3版
- 程序员表白神器。安卓程序员表白软件。程序员追女友利器=android+雪花效果+彩色气泡+心形花园+心形玫瑰花+相爱天数计时器
- gcc/g++动态链接库和静态库的链接顺序
- (OK) 调试cBPM—CentOS7—gdb—gdbserver—问题的解决—3—段错误
- mysql常见错误代码解释
- (OK) 调试cBPM—CentOS7—gdb—gdbserver—问题的解决—4—段错误
- Hadoop简介
- 在 gdb 中将某段内存 dump 保存到文件中
- Oracle the network adapter could not establish the connection
- gdb查看内存地址和栈中的值—查看虚函数表、函数地址
- GDB 调试经验总结