社区
Linux/Unix社区
帖子详情
dlsym 找不到函数指针?
aby7984
2005-12-22 08:07:56
想导出api函数,编译成so,
dlopen 有返回值,但调用dlsym,返回是空。
请问 在编译so 时有什么要注意的吗???
谢谢!!
...全文
1103
11
打赏
收藏
dlsym 找不到函数指针?
想导出api函数,编译成so, dlopen 有返回值,但调用dlsym,返回是空。 请问 在编译so 时有什么要注意的吗??? 谢谢!!
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用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
open-
dl
sym
-
dl
close函数介绍
dl
open-
dl
sym
-
dl
close函数介绍,具体介绍该函数定义、使用等
基于Hook的动态打桩工具(Linux)
linux下方便单元测试使用的动态打桩工具、可以对全局函数、静态函数、类成员函数、类虚徐成员函数进行打桩。
linux下C++动态链接C++库示例详解.pdf
linux下C++动态链接C++库示例详解.pdflinux下C++动态链接C++库示例详解.pdflinux下C++动态链接C++库示例详解.pdflinux下C++动态链接C++库示例详解.pdflinux下C++动态链接C++库示例详解.pdflinux下C++动态链接C++库示例详解.pdf
lazarus调用动态库
DL
L的例子
linux和windows下利用lazarus开发及调用动态库的例子。
Qt调用
dl
l的功能函数
本资料的内容分两部分:第一部分是QT在windows上
DL
L的导出和调用;第二部分是QT在linux上
DL
L的导出和调用。
Linux/Unix社区
23,215
社区成员
74,540
社区内容
发帖
与我相关
我的任务
Linux/Unix社区
Linux/Unix社区 应用程序开发区
复制链接
扫一扫
分享
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章