注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

逍遥子 曰:

得失失得 何必患得患失 舍得得舍 不妨不舍不得

 
 
 

日志

 
 

linux so 库的生成与调用[原]  

2012-09-09 16:11:13|  分类: linux c/c++开发 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
[本文由天地任我游总结]
本文主要通过导出一个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'

  评论这张
 
阅读(518)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018