本文主要通过导出一个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'

linux so 库的生成与调用相关推荐

  1. Linux下Makefile中动态链接库和静态链接库的生成与调用

    背景:写这篇博客的原因是:最近在搞嵌入式,需要交叉编译opencv库文件,自己写Makefile,通过arm-linux-g++编译.链接.生成可执行文件,从而实现了移植的过程.平台是Toradex的 ...

  2. C++中.lib静态库、.dll动态库的生成及调用2

    关于动.静态库的介绍及静态库的生成及调用参见:C++中.lib静态库..dll动态库的生成及调用<1>,本文主要介绍基于VS2015平台的动态库dll的生成及调用方法. 一.动态库的生成 ...

  3. C++中.lib静态库、.dll动态库的生成及调用1

    一.前言 1.动态链接库(dll)与静态链接库(lib): 动态链接库(dll)是一个可以被其他应用程序共享的程序模块,其中封装了一些可以被共享的例程和资源.在链接步骤中,连接器将从库文件取得所需的代 ...

  4. JNI开发笔记(七)--aar库的生成和调用

    aar库的生成和调用 引 前言 1. 新建一个空工程 2. 新建一个Module 3. 移植JNI工程到Module中 4. 生成aar库与so库 5. 在另一个工程中调用aar库 引 JNI开发笔记 ...

  5. Windows下动态链接库和静态链接库的生成以及调用

    Windows下静态库和动态库的生成和调用 一.简介 二.生成静态链接库(.lib)和动态链接库(.dll) 三.静态链接库的调用 四.动态链接库的调用 动态链接库的两种调用方式 仅使用.dll文件 ...

  6. 【Linux】静态库与动态库的生成及调用

    一,库:一种可执行代码的二进制形式,可以被载入内存执行.其中库分为静态库.动态库 二,静态库和动态库的区别          1)Linux 下静态库:名字一般为 lib***.a利用静态函数库编译成 ...

  7. 阐述Linux动态库的显式调用

    阐述Linux动态库的显式调用 分类: Linux 2011-02-12 10:27 168人阅读 评论(0) 收藏 举报 linux测试nulllibrarypathgcc 十年的发展,Linux系 ...

  8. vc6静态库的生成和调用

    1.静态库的生成: 在vc6.0++中Ctrl+N选择Projects下的Win32 Static Library,Project name:SumLib,点击OK,下一页中的两项可选可不选,点击Fi ...

  9. Android JNI实现Java与C/C++互相调用,以及so库的生成和调用(JNI方式调用美图秀秀so)

    前言 关于Android Studio如何继承JNI开发环境,请阅读上一篇博文 Android CMake集成JNI开发环境本篇博文将结合实例分别讲解Android中Java如何调用C/C++的方法, ...

最新文章

  1. Android:FragmentTransaction
  2. 为什么机器学习算法难以优化?一文详解算法优化内部机制
  3. 软件技术基础_软件技术(游戏软件开发)专业介绍
  4. 详解:Drools规则引擎探究
  5. boost::high_bit_mask_t和boost::low_bits_mask_t用法的测试程序
  6. TODO:Go语言goroutine和channel使用
  7. 神武4手游服务器维护,神武4手游 本周新手服限服开启 !
  8. Zabbix 监控网站的访问量
  9. Linux(Ubuntu)如何处理新添加的硬盘
  10. android屏幕有残影,如何预防手机烧屏 防止手机屏幕出现残影教程分享
  11. 数据库实验-- 更新语句
  12. resume english
  13. 第五章 组合逻辑电路设计
  14. LattePanda 外壳 HOTe-LPA 铝合金外壳
  15. 四年上册级计算机教学计划,四年级上学期教学计划(通用5篇)
  16. 有赞VS光云科技,电商SaaS的未来殊途同归
  17. TeraData Basics
  18. オフショア開発を成功させる工夫10点
  19. EDA技术 一:EDA技术概况及大规模可编程逻辑器件
  20. 如何将传统 Node.js 项目部署到 Serverless

热门文章

  1. python字典循环添加元素_牛鹭学院:学员笔记|python字典、列表、循环
  2. 【电脑问题】win10更新后,java环境有问题:Error:missing `server` JVM at `*:\java\jre8\bin\server\jvm.dll`
  3. 【java基础知识】判断字符串不为空
  4. 光电编码器的原理及应用场合_旋转式光电编码器工作原理及在视觉检测中的使用...
  5. oracle怎么定时执行存储过程6,Oracle中如何定时调用存储过程
  6. linux c普通用户怎么判断键盘是否按动_网络没问题,电脑却无法联网怎么办?win10无法联网搞定方式举例...
  7. python netsnmp_在Ubuntu18.04中关于Python使用netsnmp进行snmp编程
  8. linux查看文件的方法,查看linux文件的方法
  9. 矩阵计算的理论与方法_钢筋焊接网片实际重量与理论重量相差多少以及计算方法...
  10. 测试比java_Java11比Java8快多少,不是测试人员一眼也能看懂