Gcc编译出的库无法被Sun ld调用

发布于 2022-08-10 22:22:26 字数 1669 浏览 10 评论 5

我的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就没这个问题了。

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

勿忘初心 2022-08-12 07:11:13

原帖由 lipingtababa 于 2008-6-26 09:47 发表
请教,在c++重载的时候,编译器也要加前缀或者后缀,请问添加规则是编译器决定的还是c++规定了的?

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

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

荭秂 2022-08-12 03:12:35

请教,在c++重载的时候,编译器也要加前缀或者后缀,请问添加规则是编译器决定的还是c++规定了的?

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

一直在等你来 2022-08-11 19:43:12

原帖由 Kevin_zqw 于 2008-6-25 17:25 发表
请教:
extern "C" 的具体含义是什么?

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

猫九 2022-08-11 16:27:57

请教:
extern "C" 的具体含义是什么?

情归归情 2022-08-11 09:04:06

原帖由 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",然后重新编译试试.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文