调用so提示symbol lookup error: undefined symbol

bjskyhorse 2015-05-19 10:45:40
问题是这样:
我编译生成了一个so,这个库的里面有一个token类,token类的A函数调用了调用了B算法。我的代码里面包含对应B算法的头文件和CPP,编译生成so.B算法是存粹C实现的,因此
B算法的头文件里面也采用#ifdef __cplusplus
extern "C" {
#endif
这种方式定义。
结果测试程序调用到A算法的时候,就提示symbol lookup error: undefined symbol....
而且比较奇怪的是,我的测试程序如果采用隐式调用的方式,就没有问题。
比如这样:
p = CreateInstance(0);--实例化token类
p->A函数,
而如果采用显式调用的方式,比如通过
dlopen(so的路径, RTLD_LAZY | RTLD_GLOBAL);
dlsym也执行成功。
如果是调用so库中没有调用B算法的函数,就没有问题。(这些函数都在一个cpp里面定义,没有用到B算法的CPP)
如果调用了使用B算法的A函数(A函数和B算法分别在两个CPP中),就会提示symbol lookup error: undefined symbol
...全文
6728 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
bjskyhorse 2015-05-24
  • 打赏
  • 举报
回复
不过现在遇到一个问题,我的这个so,在自己的linux系统上功能一切正常,包括打印输出的LOG文件都正常,但是这个程序在客户的系统环境下,不但功能不正常,连LOG文件都没有打印完全。
bjskyhorse 2015-05-24
  • 打赏
  • 举报
回复
我可能没表达清楚,就是要编译B算法的CPP,生成token.so
bjskyhorse 2015-05-22
  • 打赏
  • 举报
回复
这不是编译源码,生成 token.so 吗?
zhxianbin 2015-05-21
  • 打赏
  • 举报
回复
引用 4 楼 bjskyhorse 的回复:
这就不对了,你加上cpp 就没用 so 了----------------这是什么意思,没有太明白
你这是一起编译源码,不是使用编译的 so
bjskyhorse 2015-05-20
  • 打赏
  • 举报
回复
这就不对了,你加上cpp 就没用 so 了----------------这是什么意思,没有太明白
zhxianbin 2015-05-20
  • 打赏
  • 举报
回复
引用 2 楼 bjskyhorse 的回复:
我后来解决问题了,之前的makefile 是这样写的: all: g++ -fPIC -g -m32 -fvisibility=default token.cpp -I.. -I./tinyxml/include -L./tinyxml/lib -ltinyxml -shared -o token.so 现在只要token.cpp后面加上 B算法对应的CPP即可。 但是为什么我采用隐式调用就没有问题,而采用显式调用就不行,就不清楚了。还请指教。 此外,如果-fvisibility=hidden,采用隐式调用token类中的函数可以,而显式调用 就不行,也不太明
这就不对了,你加上cpp 就没用 so 了
bjskyhorse 2015-05-19
  • 打赏
  • 举报
回复
我后来解决问题了,之前的makefile 是这样写的: all: g++ -fPIC -g -m32 -fvisibility=default token.cpp -I.. -I./tinyxml/include -L./tinyxml/lib -ltinyxml -shared -o token.so 现在只要token.cpp后面加上 B算法对应的CPP即可。 但是为什么我采用隐式调用就没有问题,而采用显式调用就不行,就不清楚了。还请指教。 此外,如果-fvisibility=hidden,采用隐式调用token类中的函数可以,而显式调用 就不行,也不太明
bjskyhorse 2015-05-19
  • 打赏
  • 举报
回复
另外,使用ldd -r也确实是没有找到B函数

18,777

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 专题技术讨论区
社区管理员
  • 专题技术讨论区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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