求助各位大侠(难题): 动态库中包含有外部变量,但是定义不在动态库中,链接会报Undefined symbol错误,但是SUSE linux是没有问题.

kewenfeng 2009-10-15 05:10:17
a.cpp

extern int aaa;

编译a.cpp,并链接为a.so. 这时候会找不到符号的错误.

b.cpp

int aaa;

问了一个同事, 说是aaa的定义也必须在a.so里面,不然AIX/HP编译会报这种错的. 但是SUSE linux屏蔽了这种错误, 所以不会报错.

但是由于特殊要求,定义不能放在a.so里, 但是不知道如何解决.

求助各位大侠帮帮忙了!!
...全文
722 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
mymtom 2009-10-17
  • 打赏
  • 举报
回复
[Quote=引用楼主 kewenfeng 的回复:]
a.cpp

extern int aaa;

编译a.cpp,并链接为a.so. 这时候会找不到符号的错误.

b.cpp

int aaa;

问了一个同事, 说是aaa的定义也必须在a.so里面,不然AIX/HP编译会报这种错的. 但是SUSE linux屏蔽了这种错误, 所以不会报错.

但是由于特殊要求,定义不能放在a.so里, 但是不知道如何解决.

求助各位大侠帮帮忙了!!

[/Quote]
记得HP上可以用-Wl,+s指示链接器链接时不要解析外部引用
kewenfeng 2009-10-15
  • 打赏
  • 举报
回复
现在不在单位,没法帖命令。
我上网baidu了一下,好像还是没有找到解决方法,如果实在不行,只能把这两个cpp链接在一个库上了。

=========== 问题类似于 ==============
各位大侠

小弟在AIX上遇到一个问题。

形象描述如下

a.c是主函数,其打开动态库libb.so ,并执行动态库中的bfunc

b.c是动态库的源代码,其中bfunc函数调用了外部的afunc函数

c.c是afunc的实现部分,其生成在另外一个静态库中。

现在bfunc无法找到afucn,不知如何才能解决

希望大侠在环境下编译,贴一段如何编译动态库的说明解决不了问题。。。

代码如下
a.c

[Copy to clipboard] [ - ]CODE:
#include <stdlib.h>;
#include <stdio.h>;
#include <dlfcn.h>;
main()
{
void * dlhandle=NULL;
int (*pfunc)();
dlhandle = dlopen( "libb.so", RTLD_LAZY );
if( dlhandle == NULL ) {
fprintf( stderr, "dlopen error(%s)\n", dlerror() );
exit( -1 );
}
fprintf( stdout, "dlhandle succ\n" );
pfunc = dlsym( dlhandle, "bfunc" );
if( pfunc == NULL ) {
fprintf( stderr, "dlsym error(%s)\n", dlerror() );
exit( -1 );
}
pfunc();
dlclose( dlhandle );
exit( 0 );
}
b.c

[Copy to clipboard] [ - ]CODE:
include <stdlib.h>;
#include <stdio.h>;
#include <dlfcn.h>;

extern int afunc();

int
bfunc()
{
fprintf( stdout, "in bfunc\n" );
fprintf( stdout, "afunc=%d\n", afunc() );
return 0;
}
c.c

[Copy to clipboard] [ - ]CODE:
#include <stdlib.h>;
#include <stdio.h>;


int
afunc()
{
#if( defined __hp__ || defined HPUX )
return 100;
#else
return 101;
#endif
}
编译动态库时候的参数用了
cc -G -brtl -berok -bnoentry -bexpall -o libb.so b.o

总之执行调用静态库中的函数就出错。。。

谢谢了


${OBJSB}b\



==========================================
有一位大侠给了一个办法(其实就是把这两个cpp都放在同一个so里,这样链接就不会报错了。)
编译过程

第一步:生成"点O文件"
命令: cc -c b.c c.c
第二步:生成"点SO文件"
命令: ld -G -lc -bnoentry -bexpall b.o c.o -o libb.so
第三步: 生成调用SO的文件
命令: cc a.c -o a.out

运行环境:AIX4.3.3+c for aix

==============================

不知道是不是真的只能这么做了,但是我感觉以前见过有人写过的代码确实是这么设计的,AIX上也没有问题的。真的搞不明白了。


blackbillow 2009-10-15
  • 打赏
  • 举报
回复
你是如何生成a.so的(我指具体的命令)
kewenfeng 2009-10-15
  • 打赏
  • 举报
回复
这样子,其实还是编译在同一个so里面了.

因为设计原因, 想把两者分离, 外部定义在so中, 实现在可执行程序中.
nevil 2009-10-15
  • 打赏
  • 举报
回复
生成b.cpp的对象文件b.o
生成a.cpp的对象文件a.o
两者一起链接成a.so

23,121

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧