LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1403|回复: 8

请教个关于静态库和动态库的问题

[复制链接]
发表于 2009-5-7 23:57:36 | 显示全部楼层 |阅读模式
我在编译一个程序,是进行CFD计算的开源软件DUNS,用fortran和C写的,
编译到gcc -o duns.e prepar.o (...o,此处略去很多.o) -lg2c -lm时出错,
/usr/bin/ld: cannot find -lg2c
我的/usr/lib/下有libg2c.so
这里一定要静态库吗?
哪里能找到这个静态库。
这个程序是个比较早的程序,发布时在Linux下好像是用gcc 2.95编译的。
发表于 2009-5-8 17:02:11 | 显示全部楼层
-L/usr/lib/
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-5-9 10:17:40 | 显示全部楼层
多谢,我在上一个贴子中落下了-L/usr/lib ,在我编译的时候已经包括这个了,也还是不行。它好像没法找到动态库。看了一下ld的帮助,可以用 :filename 直接指定库文件名 路径已经指定了,但还说找不到我的.so文件。
这程序发布时Linux下fortran是用g77编译的。我现在用fort77编或用gfortran都不行。把-lg2c去掉会报错说找不到-lgcc_s,我在Makefile的脚本里找不到-lgcc_s这一选项。挺奇怪的。
回复 支持 反对

使用道具 举报

发表于 2009-5-9 14:02:34 | 显示全部楼层
显式指定动态库的位置试试:
-L/usr/lib/libg2c.so;

ldconfig -v 结果中有libg2c.so么?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-5-10 00:37:40 | 显示全部楼层
多谢sentinel兄的热心
非常抱歉,贴命令时少贴了些东西,也是我没有注意到的。出错的编译命令是这样的:
gcc -o duns.e prepar.o (xxx.o, ...) -Xlinker -Bstatic -L(路径) -lck -lvode -lmath -L/usr/lib -lm -L/usr/lib -lg2c
其中的ck,vode,math是原来程序里编译出的静态库。它加了个-Xlinker -Bstatic选项强制成用静态库链接了,因此后面的-lg2c没有正确链接我的libg2c.so动态库。即使指定库文件名写成-L/usr/lib/ -l:libg2c.so也会出错。

最终终于找到了解决办法,在-lg2c前再改回用动态库链接:
-L/usr/lib -Wl,-Bdynamic -lg2c
或指定库文件名
-L/usr/lib -Wl,-Bdynamic -l:libg2c.so
均可。

查了手册,总结一下
`-Wl,option' 是gcc的选项,表示gcc将后面的option传给链接器,这里将-Bdynamic传给ld。-Wl好像和-Xlinker类似
`-Bdynamic‘ 是ld的选项,表示通过动态库链接(Link against dynamic libraries.)
同理,`-Bstatic' 表示用静态库链接。

这个问题解决了。这个程序后面还有些问题,我慢慢折腾。

另外按照ld的手册,指定库文件名应写成-l:filename 我这里写成 -L/usr/lib/ -l:libg2c.so
-L/usr/lib/libg2c.so好像不行
回复 支持 反对

使用道具 举报

发表于 2009-5-22 16:20:09 | 显示全部楼层
你好 我也遇到这个问题...
Linking CXX executable AMEL
/usr/local/bin/ld: cannot find -l-Wl,-Bstatic
collect2: ld 返回 1
make[2]: *** [amel/AMEL] 错误 1
make[1]: *** [amel/CMakeFiles/AMEL.dir/all] 错误 2
make: *** [all] 错误 2
能不能详细的说说解决办法阿?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-5-23 15:14:44 | 显示全部楼层
-Wl,option是gcc的选项,在链接时gcc会把option传给ld。
所以,对于你的错误看,好像是把-Wl,-Bstatic 作为了ld的选项了。-Bstatic是ld认得的选项,表示采用静态库链接。而-Wl是gcc的选项,ld是不认得的。
这样的命令是对的: gcc .... -Wl,-Bstatic ...
而这样是不行的: ld ... -Wl,-Bstatic ...
这样也是对的: ld -Bstatic ...
所以我觉得你得看一下你的Makefile关于这部分的命令,尤其是对编译器和链接器的定义比如CC = ?? LINKER = ??
回复 支持 反对

使用道具 举报

发表于 2009-5-25 21:54:30 | 显示全部楼层
potter_tang太客气了。有什么问题大家一起解决就是了。
谢谢你指出我的错误。我回头认真学习学习
回复 支持 反对

使用道具 举报

发表于 2009-6-1 09:41:46 | 显示全部楼层
恩 我后来发现那个-l是前面一段ld要加的一个包 但是没找到那个包,所以后面 跟前面连在一起咯,ld读不出来。谢谢了阿~
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表