Linux下编译so文件,调用时发现找不到CPP中的函数

wdy9927 2011-01-07 01:50:20

Linux下编译so动态库文件,调用时发现找不到CPP中的函数。

同样的程序改用.c文件,编译后的函数就能找到。

是不是cpp文件编译so时需要像windows那样导出?
...全文
1149 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
wdy9927 2011-01-17
  • 打赏
  • 举报
回复
使用.so时,在调用的cpp中使用的是extern int fuc();
现在该为:在编译.so时增加一个.h,里面是所有需要导出的函数声明。
使用.so时,将这个.h包含进去,代替自己写的extern 声明。

lvyinghong 2011-01-10
  • 打赏
  • 举报
回复
gcc 默认应该是导出函数的, 使用(visibility("default") 就可以了吧,自己看一下文档
lvyinghong 2011-01-10
  • 打赏
  • 举报
回复
像楼上说的那样试一下,

用readelf -s test.so 命令检查一下输出的函数名字,如果还不行,可以使用这两个属性,类似 vc里面控制语句了
__attribute ((alias ("new name"), visibility ("hidden")))
justkk 2011-01-10
  • 打赏
  • 举报
回复
对其中的函数使用extern "C" { foo() }
lijiangshui 2011-01-10
  • 打赏
  • 举报
回复
错误提示是什么?
哈利路亚1874 2011-01-07
  • 打赏
  • 举报
回复

#include "stdio.h"
#include "stdlib.h"
#include "dlfcn.h"

int main(void)
{
void *handle;
int (*fcn)(int x, int y);
const char *errmsg;

/* open the library */
handle = dlopen("libsthc.so", RTLD_NOW);
if(handle == NULL)
{
fprintf(stderr, "Failed to load libsthc.so: %s\n", dlerror());
return 1;
}
dlerror();

*(void **)(&fcn) = dlsym(handle, "add"); /
//fcn = dlsym(handle, "add"); / t ok in c++
if((errmsg = dlerror()) != NULL)
{
printf("%s\n", errmsg);
return 1;
}
printf("%d\n", fcn(1, 5));

dlclose(handle);
return 0;
}

c++调用动态库的一个例子!
guoxuqu 2011-01-07
  • 打赏
  • 举报
回复
可以尝试使用ldd命令查看你程序所连接的动态库的路径
wickyboy 2011-01-07
  • 打赏
  • 举报
回复
那只能是库的路径不对了,呵呵

你可以这样试试,用库的open函数来通过程序打开试试
wdy9927 2011-01-07
  • 打赏
  • 举报
回复
都是G++。

CPP 中调用so中的方法。
wickyboy 2011-01-07
  • 打赏
  • 举报
回复
你是在C中调用的so库吗?

你用的是GCC还是G++?这得高清楚才行

23,118

社区成员

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

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