unix动态链接库操作
dlopen:打开一个动态链接库;
dlclose:关闭动态链接库;
dlsym():从dll中提取函数指针以供调用;
例:
/////////////////////////////DLLTest.cpp////////////////////////////////////////////////////// #include "DateTime.h" #include <dlfcn.h> #include <iostream> using namespace std; typedef int(*FuncDatePtr)(DateType* d); int main(int argc,char* argv[]) { DateType d; //TimeType t; void* dp=0; char* error=0; cout<<"Dll Programe Demo:"<<endl; dp=dlopen("libtime.so",RTLD_NOW); if(dp==0) { cout<<"Open time.so Failed!"<<dlerror()<<endl; return 1; } //int(*f)(DateType* d); FuncDatePtr f=(FuncDatePtr)dlsym(dp,"getdate2"); //void* test=dlsym(dp,"getdate"); //funcDate=(FuncDate)funcDate; error=dlerror(); if(error) { cout<<"ERROR:"<<error<<endl; return 1; } f(&d); cout<<"Today Year="<<d.year<<endl; dlclose(dp); return 0; } //////////////////DateTime.h///////////////////////// #ifndef DATETIME_H_ #define DATETIME_H_ #ifdef __cplusplus extern "C"{ #endif struct DateType { int year; int month; int day; }; struct TimeType { int hour; int minute; int second; }; int getdate2(DateType* d); int gettime2(TimeType* t); #ifdef __cplusplus } #endif ///////////////////////////////////////DateTime.cpp//////////////////////////////////////////////////// #include <time.h> #include <iostream> #include "DateTime.h" using namespace std; int getdate2(DateType* d) { long ti; struct tm *tm; time(&ti); tm=localtime(&ti); d->year=tm->tm_year+1900; d->month=tm->tm_mon+1; d->day=tm->tm_mday; cout<<"function getdate() loaded!"<<endl; return 0; } int gettime2(TimeType* t) { long ti; struct tm *tm; time(&ti); tm=localtime(&ti); t->hour=tm->tm_hour; t->minute=tm->tm_min; t->second=tm->tm_sec; return 0; }
1.FuncDatePtr f=(FuncDatePtr)dlsym(dp,"getdate2");
等价=》
void* vf=dlsym(dp,"getdate2");
FuncDatePtr f=reinterpret_cast<FuncDatePtr>(vf);
2.定义extern "C"是为防止编译器自动改名;