免费注册 查看新帖 |

Chinaunix

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

Gcc编译出的库无法被Sun ld调用 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-06-25 13:01 |只看该作者 |倒序浏览
我的Berkeley DB是用gcc从源代码编译安装的,生成libdb_cxx.so文件,在编译的时候,我把sun的ld改名为ld.sun,安装了gnu binutil 2.17。

后来我在Solaris上安装了sun studio 12,使用sun的编译器和ld来编译ICe 3.2.1,在ld的时候,报错如下
CC -R /usr/sfw/lib  -z text -mt +p -features=tmplife -xldscope=hidden +w -erroff=hidef,wvarhidenmem,wvarhidemem -m32 -KPIC -g -L../../lib  -o ../../bin/transformdb TransformAnalyzer.o TransformVisitor.o Transformer.o transformdb.o Grammar.o Scanner.o AssignVisitor.o Data.o Error.o Functions.o Exception.o Parser.o Print.o Util.o -lSlice  -lIceXML -L/usr/local/BerkeleyDB.4.5/lib -lFreeze  -lIce -lIceUtil -lpthread -L/usr/local/BerkeleyDB.4.5/lib -ldb_cxx
Undefined symbol                                  first referenced in file

Dbt::~Dbt()                                            Transformer.o
int Db::set_bt_minkey(unsigned)           ../../lib/libFreeze.so
.....

我切换到/usr/local/BerkeleyDB.4.5/lib 目录,发现set_bt_minkey的symbol存在。只是名字有变化。
[root@sunserver:/usr/local/BerkeleyDB.4.5/lib]# nm libdb_cxx.so |grep set_bt_minkey
0002568c T _ZN2Db13set_bt_minkeyEj
00039030 t __bam_set_bt_minkey
[root@sunserver:/usr/local/BerkeleyDB.4.5/lib]#

后来改用sun studio 12编译Berkeley DB,再编译Ice就没这个问题了。

请问各位大虾,出现这个问题的原因是什么?

论坛徽章:
0
2 [报告]
发表于 2008-06-25 15:02 |只看该作者
原帖由 lipingtababa 于 2008-6-25 13:01 发表
我的Berkeley DB是用gcc从源代码编译安装的,生成libdb_cxx.so文件,在编译的时候,我把sun的ld改名为ld.sun,安装了gnu binutil 2.17。

后来我在Solaris上安装了sun studio 12,使用sun的编译器和ld来编译IC ...

是用C++编译器编译出来的吧, 试试在函数原型的定义及函数体实现中, 函数名前面都加上extern "C",然后重新编译试试.

论坛徽章:
0
3 [报告]
发表于 2008-06-25 17:25 |只看该作者
请教:
extern "C" 的具体含义是什么?

论坛徽章:
0
4 [报告]
发表于 2008-06-25 18:20 |只看该作者
原帖由 Kevin_zqw 于 2008-6-25 17:25 发表
请教:
extern "C" 的具体含义是什么?

表示这是一个C风格的函数原型, 生成目标码的内部函数符号时,不要再添加任何前缀或者后缀, 否则不同的编译器可能有不同的生成规则, 互相之间就不通用了.

论坛徽章:
0
5 [报告]
发表于 2008-06-26 09:47 |只看该作者
请教,在c++重载的时候,编译器也要加前缀或者后缀,请问添加规则是编译器决定的还是c++规定了的?

如果是编译器决定的,那岂不是不同编译器变异出来的库不能互相调用了?

论坛徽章:
0
6 [报告]
发表于 2008-06-26 12:21 |只看该作者
原帖由 lipingtababa 于 2008-6-26 09:47 发表
请教,在c++重载的时候,编译器也要加前缀或者后缀,请问添加规则是编译器决定的还是c++规定了的?

如果是编译器决定的,那岂不是不同编译器变异出来的库不能互相调用了?

确实存在两种编译器编译出来的库不能互相调用的情况. 我们甚至遇到过, 同一个编译器不同版本编译出来的C++库, 不能互相调用的情况, 以我的判断, 这必须不是C++的规则,而是编译器的规则, 我认为这就是为何每个C++编译器都要带一套自已的完整的库函数的原因,比如G++和VACPP及aCC都这样. C的库, 只要加上extern "C"的说明,就不存在此情况.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP