unix动态链接库操作

时间:2023-01-08 15:51:51

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"是为防止编译器自动改名;