社区
Linux/Unix社区
帖子详情
dlsym 找不到函数指针?
aby7984
2005-12-22 08:07:56
想导出api函数,编译成so,
dlopen 有返回值,但调用dlsym,返回是空。
请问 在编译so 时有什么要注意的吗???
谢谢!!
...全文
1009
11
打赏
收藏
dlsym 找不到函数指针?
想导出api函数,编译成so, dlopen 有返回值,但调用dlsym,返回是空。 请问 在编译so 时有什么要注意的吗??? 谢谢!!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
11 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
wallacemqx
2006-01-25
打赏
举报
回复
解决了
fierygnu
2006-01-25
打赏
举报
回复
有libhello.o或libhello.so库吗?
wallacemqx
2006-01-25
打赏
举报
回复
[meng-6@localhost dllopen]$ gcc -I./include -o main main.c -lhello -ldl
/usr/bin/ld: cannot find -lhello
collect2: ld returned 1 exit status
第三步报错,不知何故?
wyjam
2005-12-28
打赏
举报
回复
s 要另外包一层呀。
aby7984
2005-12-26
打赏
举报
回复
呵呵 真够详细的, 谢谢谢谢!!
fierygnu
2005-12-23
打赏
举报
回复
C++函数导不出。mangle后的函数名完全变了,而mangle又没有标准。
aby7984
2005-12-23
打赏
举报
回复
需要导出的是c++ 函数,
编译命令 用的是 g++ -pic -share 还是找不到。
我用 gcc 就可以。
顺便再问一下,如果我想导出类,是否还用同样的方法??
x86
2005-12-23
打赏
举报
回复
调用dlerror看看什么错误.
dlerror(); /* clear error code */
s = (actual_type) dlsym(handle, symbol_being_searched_for);
if ((err = dlerror()) != NULL)
{
/* handle error, the symbol wasn't found */
}
else
{
/* symbol found, its value is in s */
}
另外编译函数库时要加上-shared选项
这里有一个例子:
http://www.ddvip.net/OS/linux/index4/248.htm
SmileWolf
2005-12-23
打赏
举报
回复
如果用C++写,函数声明的前面加上extern "C" 修饰。否则C++编译器把函数名变得乱七八糟,dlsym不认识了^_^。
x86
2005-12-23
打赏
举报
回复
C++可以倒出,用extern "C"就是了. 给你一个完整的例子, 抄来的, 我试过可以.
==================================================
[root@localhost dlopen]# ls
chello.cpp hello.cpp include main.c
[root@localhost dlopen]# cat include/hello.h
#ifndef _HELLO_H_
#define _HELLO_H_
class CHello
{
public:
CHello();
~CHello();
int Print();
};
#endif
[root@localhost dlopen]# cat hello.cpp
#include "hello.h"
#include <iostream>
CHello::CHello()
{
}
CHello::~CHello()
{
}
int CHello::Print()
{
std::cerr << "hello world !" << std::endl;
}
[root@localhost dlopen]# cat chello.cpp
extern "C"
{
#include "hello.h"
int cprint()
{
CHello * phello;
phello = new CHello ;
(void *)phello-> Print();
return 0;
}
}
[root@localhost dlopen]# cat main.c
//#include "chello.h"
#include <dlfcn.h>
#include <stdio.h>
#include <stdlib.h>
int cprint();
int
main ()
{
char *error;
void *handle = dlopen ("libhello.so", RTLD_NOW);
if (!handle)
{
fprintf (stderr, "%s\n", dlerror ());
exit (1);
}
int (*dlprint)() ;
dlprint = dlsym (handle, "cprint");
if ((error = dlerror ()) != NULL)
{
fprintf (stderr, "%s\n", error);
exit (1);
}
(*dlprint)();
dlclose (handle);
return 0;
}
[root@localhost dlopen]# g++ -I./include -c hello.cpp
[root@localhost dlopen]# g++ -I./include -c chello.cpp
[root@localhost dlopen]# g++ -fPIC -shared -o libhello.so hello.o chello.o
[root@localhost dlopen]# gcc -I./include -o main main.c -lhello -ldl
[root@localhost dlopen]# ls
chello.cpp chello.o hello.cpp hello.o include libhello.so main main.c
[root@localhost dlopen]# ./main
hello world !
[root@localhost dlopen]#
fierygnu
2005-12-22
打赏
举报
回复
1、编译时加-pic选项
2、如果是C++写的,dlsym只能找到static全局函数。
dl
sym
如何查看一个so里面的_为什么
dl
sym
在动态加载的库中
找
不到
函数?
} 它应该被编译”测试.cpp“变成一个动态的图书馆 libtest.so test 函数并调用此函数,但看起来
dl
sym
找
不到
函数,即使它在那里。 这是 test.cpp 文件: #include void test() { std::cout ; } 这个 main.cpp 编译时...
linux下
dl
close指针异常,用
dl
open和
dl
sym
得到的
函数指针
,在
dl
close后还能继续使用么?...
不能
dl
close的,除非你是确定不再使用了的才需要
dl
close,否则不要执行这个操作共享对象通过
dl
open动态加载动态库的加载完成后,通过
dl
sym
定位到你需要执行的
函数指针
然后可以在程序中使用当不需要使用的时候,再...
dl
open 和
dl
sym
动态链接库调用函数
Linux提供了一套API来动态装载库。下面列出了这些API:函数 -
dl
open,打开一个库,并为使用该库作些准备。spa -
dl
sym
,在打开的库中查
找
符号的值。...-
dl
addr,从
函数指针
解析符号名称和所在的文件。 -
linux
函数指针
的作用,Linux基础:
函数指针
的强制类型转换
Linux基础:
函数指针
的强制类型转换先给出结论:
函数指针
是可以通过强制类型转换而指向具有不同函数签名的函数的,但是,转换后,该
函数指针
没办法正确调用所指向的函数----不能给函数传递参数。下文给出得出这个...
dl
open/
dl
sym
函数
1. 打开动态链接库: #include ... 该函数返回操作句柄,如: void *pHan
dl
e =
dl
open(strSoFilePath, RTLD_LAZY); mode是打开方式,其值有多个,不同操作系统上实现的功能有所不同,在lin
Linux/Unix社区
23,121
社区成员
74,508
社区内容
发帖
与我相关
我的任务
Linux/Unix社区
Linux/Unix社区 应用程序开发区
复制链接
扫一扫
分享
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章