动态库(.so)函数调用
2014-03-27 11:01
99 查看
最近刚刚换工作,第一次接触到要从.so动态库文件里调用函数。目前只得到.so库文件和封装的各类函数接口。在网上搜了一些,然后根据自己的代码做了整理。
首先,理解动态库,Linux中的.so文件类似于Windows中的DLL,是动态链接库。当多个程序使用同一个动态链接库时,既能节约可执行文件的大小,也能减少运行时的内存占用。具体的如何编译生成.so可以参照linux下gcc命令。
具体在调用过程中主要用到dlopen()函数和dlsym()函数,一个为打开.so库,一个为找到需调用的函数。
1.根据dlopen()写了一个打开函数。
ST_VOID * open_soXXX()
{
ST_VOID *p = NULL;
ST_CHAR *error = NULL;
p = dlopen("/lib/libXXXX.so",RTLD_LAZY);
error = dlerror();
if(error)
{
p = dlopen("lib/libXXXX.so",RTLD_LAZY);
error = dlerror();
if(error)
{
printf("error:%s", error);
}
}
return p;
}
ST_VOID、ST_CHAR就是void和char类型,因为工程需要,所以进行修改。
2.根据dlsym()写了一个相应的调用过程
ST_INT (*get_num)();
//需要调用的get_num()原型为int get_num();。另外这里get_num命名可随意,这里必须要定义成指针,因为获取的是要调用函数的地址。
get_num=(int(*)())dlsym(handle,"get_num");
// 这里参数handle是dlopen()返回的指针,参数get_num是封装在库里的函数名,也就是你要调用的函数名。
int i=get_num(); //这里就可以直接调用该函数了。
首先,理解动态库,Linux中的.so文件类似于Windows中的DLL,是动态链接库。当多个程序使用同一个动态链接库时,既能节约可执行文件的大小,也能减少运行时的内存占用。具体的如何编译生成.so可以参照linux下gcc命令。
具体在调用过程中主要用到dlopen()函数和dlsym()函数,一个为打开.so库,一个为找到需调用的函数。
1.根据dlopen()写了一个打开函数。
ST_VOID * open_soXXX()
{
ST_VOID *p = NULL;
ST_CHAR *error = NULL;
p = dlopen("/lib/libXXXX.so",RTLD_LAZY);
error = dlerror();
if(error)
{
p = dlopen("lib/libXXXX.so",RTLD_LAZY);
error = dlerror();
if(error)
{
printf("error:%s", error);
}
}
return p;
}
ST_VOID、ST_CHAR就是void和char类型,因为工程需要,所以进行修改。
2.根据dlsym()写了一个相应的调用过程
ST_INT (*get_num)();
//需要调用的get_num()原型为int get_num();。另外这里get_num命名可随意,这里必须要定义成指针,因为获取的是要调用函数的地址。
get_num=(int(*)())dlsym(handle,"get_num");
// 这里参数handle是dlopen()返回的指针,参数get_num是封装在库里的函数名,也就是你要调用的函数名。
int i=get_num(); //这里就可以直接调用该函数了。
相关文章推荐
- Linux 调用动态库(.SO文件)总结 (特指调用so文件中的函数)
- linux-C直接调用SO动态库和生成SO动态库的函数
- Android下使用dlopen函数动态调用.so链接库
- C#中调用C++动态库的函数
- 一个例子秒懂动态库与静态库的调用【详解】(.so和.a文件的相互调用)
- Linux 调用动态库(.SO文件)总结
- Android下使用dlopen函数动态调用.so链接库 [转]
- C语言 调用的动态库函数重名问题分析
- ndk调用so动态库 编译另一个so库
- Qt打开外部程序和文件夹需要注意的细节(Qt调用VC写的动态库,VC需要用C的方式输出函数,否则MinGW32编译过程会报错)
- 深入理解动态库- 函数调用,__stdcall,__cdecl,__fastcall,thiscal
- linux调用动态库so文件
- linux c编程调用系统的动态库时,要使用dlopen等函数吗?
- 使用反汇编理解动态库函数调用方式GOT/PLT
- linux 调用动态库so文件
- Tcl中调用C#编写的动态库函数 工具:vs2008 tcl8.6
- JNI调用动态库.so
- Linux下静态库_库的基本概念;如何生成静态库动态库;nm查看库中包含那些函数、ar生成静态库,查看库中包含那些.o文件、ldd查看程序依赖的.so文件;gcc/g++与库相关的参数-L,-l,-f
- linux 动态调用 .so 库文件中的函数
- (备忘)在Linux下动态调用so中的函数