免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 6126 | 回复: 4
打印 上一主题 下一主题

[已经解决]如何使用gcc在编译的时候既指定动态链接又指定静态链接? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-12-24 10:57 |只看该作者 |倒序浏览
本帖最后由 vaqeteart 于 2010-12-24 15:51 编辑

在使用gcc编译的时候,有些库同时有静态和动态的版本,我的目的是,在编译的时候,我可以自由指定使用静态或者动态库进行链接。

感谢大家帮助,这个问题的答案我已经找到了,总结参见:
点击这里阅读解决方法

原问题描述如下:
我之前查找了许多,也没有找到,
有一个:http://bbs.chinaunix.net/thread-111581-1-1.html
也没有说清楚。

所以自己实践如下:
按照我的理解,基于如下原理来进行同时静态链接和动态连接:
以库a和b为例:
如果同时存在:liba.so liba.a libb.so libb.a
使用-la -lb选项的时候,会选择动态的liba.so libb.so来进行链接。
如果想要使用静态库,那么使用-Bstatic选项,接着-Bstatic选项后面的-l都选择静态库链接了。
如果既想要静态,又要动态,那么使用-Bstatic和-Bdynamic选项,-Bdynamic意义类似-Bstatic.
通过man ld可知,-static和-Bstatic应该等价,但是实践发现使用了-static连glibc都不依赖了。

但是,我实践之后,结果不是我想要的,所以我想请教大家究竟有没有好用的方法,可以自由指定哪些库用静态的,哪些用动态的?
我在附件里面给出了完整的测试源代码,希望好心人能够帮忙看一下怎么修改我的makefile。
test.zip (1.77 KB, 下载次数: 139)
下面是我的makefile,以及输出结果:
Makefile
  1. all:testapp
  2. testapp:test_all liba.so liba.a libb.so libb.a \
  3.         test_static test_statica_staticb test_statica_dynamicb test_dynamica_staticb test_dynamica_dynamicb
  4. myliba.o:myliba.c
  5. mylib.o:mylibb.c
  6. test_all:main.c myliba.o mylibb.o
  7.     gcc -o $@ $^
  8. liba.so:myliba.o
  9.     gcc -shared -o liba.so myliba.o
  10. libb.so:mylibb.o
  11.     gcc -shared -o libb.so mylibb.o
  12. liba.a:myliba.o
  13.     ar -r liba.a myliba.o
  14. libb.a:mylibb.o
  15.     ar -r libb.a mylibb.o
  16. test_static:main.c
  17.     gcc -o $@ $< -L./ -static -la -lb
  18. test_statica_staticb:main.c
  19.     gcc -o $@ $< -L./ -Bstatic -la -lb
  20. test_statica_dynamicb:main.c
  21.     gcc -o $@ $< -L./ -Bstatic -la -Bdynamic -lb
  22. test_dynamica_staticb:main.c
  23.     gcc -o $@ $< -L./ -Bdynamic -la -Bstatic -lb
  24. test_dynamica_dynamicb:main.c
  25.     gcc -o $@ $< -L./ -la -lb
  26. .PHONY:clean
  27. clean:
  28.     rm *.o *.a *.so test*
复制代码
输出结果:
  1. $ ldd test*
  2. test_all:
  3.         linux-gate.so.1 =>  (0x00ab5000)
  4.         libc.so.6 => /lib/libc.so.6 (0x0016d000)
  5.         /lib/ld-linux.so.2 (0x0014e000)
  6. test_dynamica_dynamicb:
  7.         linux-gate.so.1 =>  (0x00619000)
  8.         liba.so => not found
  9.         libb.so => not found
  10.         libc.so.6 => /lib/libc.so.6 (0x0016d000)
  11.         /lib/ld-linux.so.2 (0x0014e000)
  12. test_dynamica_staticb:
  13.         linux-gate.so.1 =>  (0x00da9000)
  14.         liba.so => not found
  15.         libb.so => not found
  16.         libc.so.6 => /lib/libc.so.6 (0x0016d000)
  17.         /lib/ld-linux.so.2 (0x0014e000)
  18. test_static:
  19.         not a dynamic executable
  20. test_statica_dynamicb:
  21.         linux-gate.so.1 =>  (0x0082c000)
  22.         liba.so => not found
  23.         libb.so => not found
  24.         libc.so.6 => /lib/libc.so.6 (0x0016d000)
  25.         /lib/ld-linux.so.2 (0x0014e000)
  26. test_statica_staticb:
  27.         linux-gate.so.1 =>  (0x002ff000)
  28.         liba.so => not found
  29.         libb.so => not found
  30.         libc.so.6 => /lib/libc.so.6 (0x0016d000)
  31.         /lib/ld-linux.so.2 (0x0014e000)
复制代码

论坛徽章:
0
2 [报告]
发表于 2010-12-24 10:59 |只看该作者
我很疑惑,为什么无论如何都使用liba和libb的动态版本

论坛徽章:
2
摩羯座
日期:2013-10-10 14:29:04天蝎座
日期:2014-01-03 09:14:49
3 [报告]
发表于 2010-12-24 11:51 |只看该作者
用automake和libtool试试?

论坛徽章:
0
4 [报告]
发表于 2010-12-24 13:21 |只看该作者
1,库文件名为什么非要相同,不同文件名即可以解决问题
2,动态库和静态库的执行效率几乎相同,完全可以选其一

不知道楼主的使用环境为什么非要这样做?

论坛徽章:
0
5 [报告]
发表于 2010-12-24 15:47 |只看该作者
谢谢各位回复,我已经找到答案了。

1,库文件名为什么非要相同,不同文件名即可以解决问题
2,动态库和静态库的执行效率几乎相同,完全可以选 ...
bekars 发表于 2010-12-24 13:21


是可以用不同的文件名字,但是我的目的是想要知道根本的原因,而不是解决问题就行了。
至于为什么这么做,因为我目前做的一个项目中,需要连接一个库,这个库是他们提供的,在安装交叉编译环境的时候自动生成了lib*.so和lib*.a两种版本,这样我怎么能改个名字就行呢?
   

原来-Bstatic和-Bdynamic这两个链接器选项需要用gcc的-Wl,option来传递才行。
我最新写的Makefile和源代码.
Makefile:
  1. CFLAGS+=-DMYFLAG
  2. all:testapp
  3. testapp:test_all liba.so liba.a libb.so libb.a \
  4.                 test_static test_statica_staticb test_statica_dynamicb test_dynamica_staticb test_dynamica_dynamicb
  5. myliba.o:myliba.c
  6. mylib.o:mylibb.c
  7. test_all:main.c myliba.o mylibb.o
  8.         gcc -o $@ $^
  9. liba.so:myliba.o
  10.         gcc -shared -o liba.so myliba.o
  11. libb.so:mylibb.o
  12.         gcc -shared -o libb.so mylibb.o
  13. liba.a:myliba.o
  14.         ar -r liba.a myliba.o
  15. libb.a:mylibb.o
  16.         ar -r libb.a mylibb.o
  17. test_static:main.c
  18.         gcc -o $@ $< -L./ -static -la -lb
  19. test_statica_staticb:main.c
  20.         gcc -o $@ $< -L./ -Wl,-Bstatic -la -lb -Wl,-Bdynamic
  21. test_statica_dynamicb:main.c
  22.         gcc -o $@ $< -L./ -Wl,-Bstatic -la -Wl,-Bdynamic -lb
  23. test_dynamica_staticb:main.c
  24.         gcc -o $@ $< -L./ -Wl,-Bdynamic -la -Wl,-Bstatic -lb -Wl,-Bdynamic
  25. test_dynamica_dynamicb:main.c
  26.         gcc -o $@ $< -L./ -la -lb
  27. .PHONY:clean
  28. clean:
  29.         rm *.o *.a *.so test*
复制代码
源代码:
04_dynamic_with_static_link_test.zip (2.58 KB, 下载次数: 135)
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP