当前位置: 技术问答>linux和unix
在linux下如何通过动态链接库调用对象?
来源: 互联网 发布时间:2015-09-03
本文导语: 通过下面二个程序我知道如何调用动态链接库中的函数了: //slib.c int func(char* msg) { printf("func be Executed!n"); printf(msg); return 0; } //hello.c #include #include void* slib=0; void (*func)(char*); const char* hError; int main(int ar...
通过下面二个程序我知道如何调用动态链接库中的函数了:
//slib.c
int func(char* msg)
{
printf("func be Executed!n");
printf(msg);
return 0;
}
//hello.c
#include
#include
void* slib=0;
void (*func)(char*);
const char* hError;
int main(int argc,char* argv[])
{
slib=dlopen("./slib.so",RTLD_LAZY);
hError=dlerror();
if (hError)
{
printf("dlopen Error!n");
return 1;
}
func=dlsym(slib,"func");
hError=dlerror();
if (hError)
{
printf("dlsym Error!n");
return 1;
}
func("How do you do?n");
dlclose(slib);
hError=dlerror();
if (hError)
{
printf("dlclose Error!n");
return 1;
}
return 0;
}
然后编译:
#gcc -c -fpic slib.c
#gcc -shared -lc -o slib.so slib.o
#gcc -o hello hello.c -ldl
之后执行hello就可调用slib.so里面的func函数
但现在我想在slib.c里放置一个对象,比如
class A
{
public:
int a;
void prin() {printf("a=%d",a);}
};
如果这样的话我如何在hello里定义slib.so里的A对象obj1,并用obj1.a=1,obj1.prin()来输出a的值?
请帮我改一下这二个c文件(或cpp文件),如果编译方法也要改的话再给我编译的方法!
谢谢了!
//slib.c
int func(char* msg)
{
printf("func be Executed!n");
printf(msg);
return 0;
}
//hello.c
#include
#include
void* slib=0;
void (*func)(char*);
const char* hError;
int main(int argc,char* argv[])
{
slib=dlopen("./slib.so",RTLD_LAZY);
hError=dlerror();
if (hError)
{
printf("dlopen Error!n");
return 1;
}
func=dlsym(slib,"func");
hError=dlerror();
if (hError)
{
printf("dlsym Error!n");
return 1;
}
func("How do you do?n");
dlclose(slib);
hError=dlerror();
if (hError)
{
printf("dlclose Error!n");
return 1;
}
return 0;
}
然后编译:
#gcc -c -fpic slib.c
#gcc -shared -lc -o slib.so slib.o
#gcc -o hello hello.c -ldl
之后执行hello就可调用slib.so里面的func函数
但现在我想在slib.c里放置一个对象,比如
class A
{
public:
int a;
void prin() {printf("a=%d",a);}
};
如果这样的话我如何在hello里定义slib.so里的A对象obj1,并用obj1.a=1,obj1.prin()来输出a的值?
请帮我改一下这二个c文件(或cpp文件),如果编译方法也要改的话再给我编译的方法!
谢谢了!
|
在hello.cpp里定义一个对象的实例(extern),然后把dlsym出来的指针转换成class A*。但更好的办法是hello.cpp里提供一个生成对象的make_A()函数,dlsym()得到这个函数地址,调用这个来产生对象。
|
初学.Mark一下.