本文主要通过导出一个log文件操作的类,来说明linux下so库的生成与调用。先说明一下本文中的几个文件和其作用:
1)ilogfile.h 主要用于定义Clogfile类的借口和声明一个C风格的create导出函数,该文件为导出文件,在用g++编译的时候需放在最前面。
2)logfile.h 主要定义了Clogfile类的头文件。
3)logfile.cpp 主要提供了Clogfile类的定义。
4)create.cpp 主要定义了一个create函数,在使用时用户可以通过该函数获取一个Clogfile类的对象地址,并将该地址转换为接口对应的Ilogfile类型,这样就对最终用户封闭了Clogfile类。
根据上述1)、2)、3)、4)文件生成一个log.so的动态链接库。
5) main.cpp 该文件定义了一个main函数,在该函数中通过调用生成的动态链接库log.so来实现对Clogfil类的操作。
具体文件的内容如下:
-----------------ilogfile.h文件---------------------------
//ilogfile.h
#ifndef _ILOGFILE_H
#define _ILOGFILE_H
#include
using namespace std;
class Ilogfile
{
public:
virtual bool open() = 0;
virtual void close() = 0;
virtual void write(const string& logItemId, const string& logItemContent) = 0;
virtual string read(const string& logItemId) = 0;
};
extern "C" Ilogfile*create();
#endif//_ILOGFILE_H
-----------------logfile.h文件---------------------------
//logfile.h
#include"ilogfile.h"
#include
using namespace std;
class Clogfile : public Ilogfile
{
public:
bool open();
void close();
void write(const string& logItemId, const string& logItemContent);
string read(const string& logItemId);
};
----------------logfile.cpp文件----------------------------
//logfile.cpp
#include "logfile.h"
bool Clogfile::open()
{
cout<<"This is function : Clogfile::open()"<
----------------create.cpp文件----------------------------
//create.cpp
#include"logfile.h"
Ilogfile* create()
{
return (Ilogfile*)new Clogfile();
}
---------------main.cpp文件-----------------------------
//main.cpp
#include
#include
#include
#include"ilogfile.h"
#include
using namespace std;
typedef Ilogfile* (*PFunc)();
int main()
{
void *SoLib = NULL ;
SoLib=dlopen("./log.so",RTLD_LAZY);
const char *err = dlerror();
if(err != NULL)
{
fputs(err, stderr);
exit(1);
}
PFunc pcreate = NULL;
pcreate = (PFunc)dlsym(SoLib,"create");
if(NULL == pcreate)
{
cout<<"Can not get create function from log.so"<open();
return 0;
}
接下来通过快捷键“alt+Ctrl+t”打开终端命令框,并进入到上述几个文件保存的目录中,然后生成动态库并进行调用,过程如下:
1)生成动态库log.so,命令为:g++ ilogfile.h logfile.h logfile.cpp create.cpp -fPIC -shared -o log.so
注意:上述命令里ilogfile.h为导出文件,要放在第一个位置。
2)编译main.cpp生成调用动态库的main文件,命令为:g++ main.cpp -o main -ldl
3) 执行生成的main文件,命令为:./main
需要注意,在第2)步中需要加上指令-ldl,l是L的小写形式,如果不加上,则会出现下面的错误:
main.cpp:(.text+0x21): undefined reference to `dlopen'
main.cpp:(.text+0x2a): undefined reference to `dlerror'
main.cpp:(.text+0x72): undefined reference to `dlsym'