动态库调用的问题

好梦一场睡 2013-08-06 10:38:18
这是man.cpp
#include<iostream>
#include<dlfcn.h>
using namespace std;
int main()
{
void *handle=dlopen("./libprint.so",RTLD_LAZY);
typedef void(*haha)();
if(!handle)
{
cout<<"dlopen error"<<endl;
return 1;
}
haha lprint=(haha)dlsym(handle,"lprint");
const char *error=dlerror();
if(error)
{
cout<<"dlsym error"<<endl;
dlclose(handle);
return 1;
}
lprint();
dlclose(handle);
return 0;
Print.h
#include<iostream>
using namespace std;
void lprint(void);
print.cpp:
#include<iostream>
#include"print.h"
using namespace std;
void lprint()
{
cout<<"I'm ok!\nIt's OK!"<<endl;
}
其中print.cpp和print.h生成libprint.so
调用的时候老失败显示:dlsym error,怎么回事,拿出错了
...全文
132 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
好梦一场睡 2013-08-07
  • 打赏
  • 举报
回复
权限都有,路径也没为题,我又试了一下绝对路径,还是不行,问题一样,用直接调用可以,重写main.cpp,使用如下方法能运行 g++ -o main main.cpp ./libprint.so
qzf362269994 2013-08-07
  • 打赏
  • 举报
回复
http://blog.csdn.net/jtlyr/article/details/5707594
好梦一场睡 2013-08-07
  • 打赏
  • 举报
回复
感谢各位的帮忙,问题解决了在void lprint(void)前面加上extern "C",就可以了。 在print.cpp中函数lprint被定义为extern "C"。它在main.cpp中被dlsym调用。函数必须以extern "C"限定,否则我们无从知晓其符号名。
好梦一场睡 2013-08-07
  • 打赏
  • 举报
回复
还是一样,没啥变化
赵4老师 2013-08-07
  • 打赏
  • 举报
回复
学会用objdump
赵4老师 2013-08-07
  • 打赏
  • 举报
回复
haha lprint=(haha)dlsym(handle,"_lprint");试试看。
有点清眸 2013-08-06
  • 打赏
  • 举报
回复
1、检查下你生成的动态库是否具有read权限。 2、检查下lib路径是否正确设置。

64,642

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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