1. 背景

库:就是已经编写好的,后续可以直接使用的代码。

c++静态库:会合入到最终生成的程序,使得结果文件比较大。优点是不再有任何依赖。

c++动态库:动态库,一个文件可以多个代码同时使用内存中只有一份,节省内存,可以随主代码一起编译。缺点是需要头文件。

网友说:库就是除了main函数之外的其他代码,都可以组成库。

2. 只介绍动态库(工作中主要用动态库)

C++使用动态库比C语言使用动态库稍微麻烦点。

因为C++支持函数重载(参数变量个数不同、参数类型不同、类型修饰符不同const/not const等),都会使得C++对函数名进行重写,不方便根据函数名查找对应函数

C++中可以使用extern关键字修饰对应的函数,表示函数名按照C言语分隔编译,不进行改写。(extern关键字另一个关键字修饰变量,表示变量在其他文件中已经定义。通常见于修饰全局变量)

3. 使用so文件需要的api

头文件 #include <dlfcn.h>

dlopen以指定的模式打开共享链接库。使用可以参考: http://man7.org/linux/man-pages/man3/dlopen.3.html

4. C++使用动态链接库实例

4.1 test.h

 class Test{
public:
virtual int get();
virtual void set(const int num);
};

4.2 test.cpp

 #include <iostream>
#include "test.h" int g_num = ; ///全局变量 int Test::get() { return g_num; }
void Test::set(const int num){ g_num = num; } #ifdef __cplusplus
extern "C" {
#endif Test* create(){ return new Test; } #ifdef __cplusplus
}
#endif

4.3 main.cpp

 #include <iostream>
#include <dlfcn.h>
#include "test.h"
using namespace std; //声明函数指针
typedef Test* (*so_init)(); //定义插件类来封装,句柄用完后需要释放
struct Plugin{
void *handle;
Test *t; Plugin():handle(NULL), t(NULL) { }
~Plugin(){
if(t) { delete t; }
if (handle) { dlclose(handle); }
}
}; int create_instance(const char *so_file, Plugin &p){
//根据特定的模式打开so文件, 获取so文件句柄
//RTLD_NOW:需要在dlopen返回前,解析出所有未定义符号
//RTLD_DEEPBIND:在搜索全局符号前先搜索库内的符号,避免同名符号的冲突
p.handle = dlopen(so_file, RTLD_NOW | RTLD_DEEPBIND);
if (!p.handle) {
cout << "Cannot open library: " << dlerror() << endl;
return -;
} //根据字符串"create"读取库中对应到函数, 并返回函数地址,可以理解为一种间接的“反射机制
so_init create_fun = (so_init) dlsym(p.handle, "create");
if (!create_fun) {
cout << "Cannot load symbol" << endl;
dlclose(p.handle);
return -;
} //调用方法, 获取类实例
p.t = create_fun(); return ;
} int main(){
Plugin p1;
Plugin p2; if ( != create_instance("./libtest_1.so", p1)
|| != create_instance("./libtest_2.so", p2)){
cout << "create_instance failed" << endl;
return ;
} p1.t->set(); //对库1中到全局变量进行设置
p2.t->set(); //对库2中到全局变量进行设置 //输出两个库中的全局变量
cout << "t1 g_num is " << p1.t->get() << endl;
cout << "t2 g_num is " << p2.t->get() << endl;
return ;
}

执行:

g++ -fPIC -shared test.cpp -o libtest_1.so

g++ -fPIC -shared test.cpp -o libtest_2.so

g++ -g -Wl,--no-as-needed -ldl main.cpp -rdynamic

Linux 动态链接库(.so)的使用的更多相关文章

  1. Linux动态链接库的创建与使用

    Linux动态链接库的创建与使用1. 介绍     使用GNU的工具我们如何在Linux下创建自己的程序函数库?一个“程序函数库”简单的说就是一个文件包含了一些编译好的代码和数据,这些编译好的代码和数 ...

  2. linux 动态链接库查找方法;查找动态链接库位置; LIBRARY_PATH 和 LD_LIBRARY_PATH 的区别;LD_LIBRARY_PATH and LD_RUN_PATH的区别;

    今天配置之前项目的时候,发现有些动态链接库变了,想看看现在应用在使用哪些动态链接库的时候,进一步查了点资料: 下面针对linux动态链接库查找方法和动态链接库位置配置的过程进行记录: LIBRARY_ ...

  3. Linux 动态链接库

    如何使用动态链接库 Linux下打开使用动态链接库需要三步(实际上和windows下基本一样):1.加载动态链接库,通过调用库函数dlopen()获得链接库的句柄,对应于windows下的 AfxLo ...

  4. Linux 动态链接库学习笔记

    参考资料: http://www.linuxidc.com/Linux/2012-01/50739.htm http://www.yolinux.com/TUTORIALS/LibraryArchiv ...

  5. linux动态链接库---一篇讲尽

    一般我们在Linux下执行某些外部程序的时候可能会提示找不到共享库的错误, 比如: tmux: error while loading shared libraries: libevent-1.4.s ...

  6. Linux动态链接库的生成和使用

    目录 1. 编写C程序 2. 编译动态链接库 3. 使用共享库 4. 执行程序 5. 参考资料 1. 编写C程序 比如编写myfunc.c文件,里面包含两个函数,一个是say_hello,另一个是ca ...

  7. Linux 动态链接库 - dll劫持

    如何使用动态链接库 Linux下打开使用动态链接库需要三步(实际上和windows下基本一样):1.加载动态链接库,通过调用库函数dlopen()获得链接库的句柄,对应于windows下的 AfxLo ...

  8. Linux动态链接库的使用

    1.前言 在实际开发过程中,各个模块之间会涉及到一些通用的功能,比如读写文件,查找.排序.为了减少代码的冗余,提高代码的质量,可以将这些通用的部分提取出来,做出公共的模块库.通过动态链接库可以实现多个 ...

  9. linux动态链接库

    前言 静态链接库会编译进可执行文件,并被加载到内存,会造成空间浪费 静态链接库对程序的更新.部署.发布带来麻烦.如果静态库更新了,使用它的应用程序都需要重新编译.发布给用户(对于玩家来说,可能是一个很 ...

随机推荐

  1. Java程序员进击书籍推荐

    计算机基础 计算机科学导论 计算机操作系统 操作系统原理及应用(Linux) Java 基础和进阶 疯狂Java讲义 Java 核心基础卷1/2 Java编程思想 Java 8实战 jls11 Eff ...

  2. Linux设备驱动之USB

    Linux驱动框架分析(一)        事实上,Linux的设备驱动都遵循一个惯例——表征驱动程序(用driver更贴切一些,应该称为驱动器比较好吧)的结构体,结构体里面应该包含了驱动程序所需要的 ...

  3. BZOJ4541 [Hnoi2016]矿区

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...

  4. Oracle 取整函数

    ceil(n):ceil英文含义是天花板,天花板在上面,所以意为向上取整,即大于或等于n的整数. floor(n):floor英文含义是地板,地板在下面,所以意为向下取整,即小于或等于n的整数.

  5. .net中实现RSS方法

    引用 如何在.net动态网站中实现RSS呢?主要思想是编写一个能够自动按照RSS格式生成xml文档的通用类.具体步骤如下: 步骤一:创建RSS通用类 C#代码 using System;   usin ...

  6. Cocos2d-x3.1TestCpp之NewRenderTest Demo分析

    1.代码构成 VisibleRect.h VisibleRect.cpp AppDelegate.h AppDelegate.cpp HelloWorldScene.h HelloWorldScene ...

  7. TrinityCore3.3.5环境搭建

    说起TrinityCore,可能知道的人不多,但是说起MaNGOS(芒果)知道的人应该就不少了.MaNGOS是一个魔兽私服服务器端,TrinityCore继承自TrinityCore并且做了优化,一直 ...

  8. 在vs2012下编译出现Msvcp120d.dll 丢失的问题

    之前在vs2012下编译一个opencv程序时,一直出现msvcp120d.dll文件丢失的提示信息,最初会在网上找dll下载,将其拖入系统文件夹再进行regsvr32命令操作,结果都没有解决错误,甚 ...

  9. 在ASP.NET Web API中实现CORS(跨域资源共享)

    默认情况下,是不允许网页从不同的域访问服务器资源的,访问遵循"同源"策略的原则. 会遇到如下的报错: XMLHttpRequest cannot load http://local ...

  10. iOS非ARC内存管理摘要 - 实践型

    关于ios内存管理.在开发过程中,内存管理很重要,我简单说明一下. 1.正确用法 UIView *v = [[UIView alloc] init]; //分配后引用计数为1 [self.view a ...