linux so 库的生成与调用

本文主要通过导出一个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<string>
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<iostream>
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()"<<endl;
    return true;
}

void Clogfile::close()
{
    cout<<"This is function : Clogfile::close()"<<endl;
}

void Clogfile::write(const string& logItemId, const string& logItemContent)
{
    cout<<"This is function : Clogfile::write(...)"<<endl;
}

string Clogfile::read(const string& logItemId)
{
    cout<<"This is function : Clogfile::read(...)"<<endl;
}


----------------create.cpp文件----------------------------
 

//create.cpp

#include"logfile.h"
Ilogfile* create()
{
    return (Ilogfile*)new Clogfile();
}


---------------main.cpp文件-----------------------------
 

//main.cpp
#include <stdlib.h>
#include<stdio.h>
#include<dlfcn.h>
#include"ilogfile.h"
#include<iostream>
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"<<endl;
        return 0;
    }
    Ilogfile* plogfile = (*pcreate)();
    plogfile->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'

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值