免费注册 查看新帖 |

Chinaunix

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

[C++] 请问,ld链接生成的时候,加载动态库/静态库顺序如何? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-02-18 11:10 |只看该作者 |倒序浏览
想了解,如果-lm 命令的时候,同时有libm.a和libm.so的话,实际上用哪个?
我在solaris上面做的试验,如果两个同时存在,则选择libm.so。如果只有libm.a那么-lm就是链接libm.a

问题: 所有平台都是这样的么? 还是和我的具体使用的编译器或者是场景有关? 谢谢!

实验如下
-------------------------------------------------------------------------
> cat n.c
#include<stdio.h>
void f(){printf("fdynamic\n");}
> gcc --share -c n.c
> gcc -G -o libm.so n.o
> cat m.c
#include<stdio.h>
void f(){printf("fstatic\n");}
> gcc -c m.c
>ar -r libm.a m.o

> cat a.c
int main(void){
f();
}
> gcc a.c -o main -L. -lm
>./main
fdynamic
--------------------------------------------------------------------------
如果mv libm.so libm.so.keep再gcc a.c -o main -L. -lm
>./main
fstatic

论坛徽章:
0
2 [报告]
发表于 2009-02-18 11:43 |只看该作者
gcc默认使用动态库方式链接,找不到动态库才会去找静态库,若要使用静态库需给链接器指定参数-static。

论坛徽章:
0
3 [报告]
发表于 2009-02-18 11:51 |只看该作者
原帖由 乱.码 于 2009-2-18 11:43 发表
gcc默认使用动态库方式链接,找不到动态库才会去找静态库,若要使用静态库需给链接器指定参数-static。

谢谢,其他的环境和编译器是不是也是这样?

手上只有solaris+gcc2.95.2

论坛徽章:
0
4 [报告]
发表于 2009-02-18 11:57 |只看该作者
原帖由 jeanlove 于 2009-2-18 11:51 发表

谢谢,其他的环境和编译器是不是也是这样?

手上只有solaris+gcc2.95.2


不谢:wink:
这个跟操作系统没关系,应该是gcc的一个标准。

论坛徽章:
0
5 [报告]
发表于 2013-06-06 10:06 |只看该作者
同样的库的加载顺序是什么?


hkbdm@ubuntu:~$ strings /etc/ld.so.cache |grep libc.so
libc.so.6
/lib/x86_64-linux-gnu/libc.so.6
libc.so.6
/lib/i386-linux-gnu/libc.so.6
libc.so.6
/lib32/libc.so.6
hkbdm@ubuntu:~$

我编译android的时候报错,提示skipping incompatible /usr/lib/x86_64-linux-gnu/libc.so when searching for -lc
我认为是我没有安装libc6-dev:i386导致
所以我安装了这个包后,发现 /etc/ld.so.cache有2个相同的so。2个同样的库的加载顺序是什么?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP