Linux下C++动态链接库的生成以及使用

目录

  • 一.前言
  • 二.生成动态链接库
  • 三.使用动态链接库


一.前言

这篇文章简单讨论一下Linux下如何使用gcc/g++生成和使用C++动态链接库(.so文件)。

二.生成动态链接库

先看下目录结构

在这里插入图片描述

然后看下代码

//demo.h#ifndef DEMO_H
#define DEMO_H#include<string>class Demo
{
public:Demo(void) = default;~Demo(void) noexcept = default;void Print(const std::string& msg);
};#endif // !DEMO_H
//demo.cpp#include"demo.h"#include<iostream>void Demo::Print(const std::string& msg)
{std::cout << "msg:" << msg << std::endl;
}

很简单的代码,就是提供一个打印字符串的接口。

然后我们使用demo.h和demo.cpp来生成动态链接库。

执行命令g++ -shared -fPIC demo.cpp -o libdemo.so生成动态链接库libdemo.so,注意动态链接库必须要包含lib前缀,另外我们知道Linux下动态链接库的后缀是.so。

g++ -shared -fPIC demo.cpp -o libdemo.so命令中:
-shared表示生成动态链接库
-fPIC表示生成位置无关的代码,有些系统需要无论加载到什么位置都可以正常工作的位置无关代码

在这里插入图片描述

我们可以看到已经生成了动态链接库libdemo.so。

三.使用动态链接库

我们看一下怎么使用动态链接库,新建main.cpp来使用动态链接库。

先看下目录结构

在这里插入图片描述

然后看下代码

//main.cpp#include<string>#include"demo.h"int main(int argc, char* argv[])
{Demo demo;std::string strMsg("main msg");demo.Print(strMsg);return 0;
}

其实就是很简单的代码。

然后执行命令g++ -o main main.cpp -L. -ldemo使用main.cpp和libdemo.so生成可执行文件main。其中-L.指定要链接的库所在位置是当前目录,-ldemo指定要链接的库是libdemo.so。

在这里插入图片描述

我们可以看到已经生成了可执行文件main,我们试着执行一下。

在这里插入图片描述

发现报错,这个错误信息就是找不到动态链接库libdemo.so,我们使用ldd ./main命令确认一下情况。

在这里插入图片描述

我们发现确实找不到动态链接库libdemo.so,这是因为系统不知道去哪里找libdemo.so,具体内容这篇文章里就不展开了,我们先使用命令export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/debian/code/demo设置环境变量解决一下,这个目录是libdemo.so所在的位置。

在这里插入图片描述

我们可以看到这个时候就可以找到动态链接库libdemo.so了,而且可以正常执行。这个时候如果删除了动态链接库libdemo.so,main也会不可以正常执行了,这是动态链接库的特性,也就是所谓的动态链接。

需要注意的是,动态链接库的符号其实是需要导出的,g++编译的时候默认是设置-fvisibility=default选项,默认就会导出符号,但是如果开启了-fvisibility=hidden选项,我们想要导出某个符号的话,就需要设置属性__attribute__((visibility(“default”)))。

比如我们使用命令g++ -shared -fPIC ./demo.cpp -o libdemo.so -fvisibility=hidden来生成动态库libdemo.so,那这个时候执行main就会报错的。

在这里插入图片描述

这个报错的意思就是符号未定义。

我们修改一下声明代码就可以解决了。

看下代码

//demo.h#ifndef DEMO_H
#define DEMO_H#include<string>class Demo
{
public:Demo(void) = default;~Demo(void) noexcept = default;__attribute__((visibility("default"))) void Print(const std::string& msg);
};#endif // !DEMO_H

然后我们还是使用命令g++ -shared -fPIC ./demo.cpp -o libdemo.so -fvisibility=hidden来生成动态库libdemo.so。

在这里插入图片描述

这个时候main就可以正常执行了。

在这里插入图片描述


欢迎讨论,欢迎指正,欢迎转载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/263924.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【深度学习】强化学习(四)强化学习的值函数

文章目录 一、强化学习问题1、交互的对象2、强化学习的基本要素3、策略&#xff08;Policy&#xff09;4、马尔可夫决策过程5、强化学习的目标函数6、值函数1. 状态值函数&#xff08;State Value Function&#xff09;a. 状态值函数的定义b. 贝尔曼方程&#xff08;Bellman Eq…

class069 从递归入手三维动态规划【算法】

class069 从递归入手三维动态规划 code1 474. 一和零 // 一和零(多维费用背包) // 给你一个二进制字符串数组 strs 和两个整数 m 和 n // 请你找出并返回 strs 的最大子集的长度 // 该子集中 最多 有 m 个 0 和 n 个 1 // 如果 x 的所有元素也是 y 的元素&#xff0c;集合 x 是…

深入浅出分析kafka客户端程序设计 ----- 生产者篇----万字总结

前面在深入理解kafka中提到的只是理论上的设计原理&#xff0c; 本篇讲得是基于c语言的kafka库的程序编写&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 首先要编写生产者的代码&#xff0c;得先知道生产者的逻辑在代码上是怎么体现的 1.kafka生产者的逻辑 …

深度学习——第4.1章 深度学习的数学基础

第4章 深度学习的数学基础 目录 4.1 向量 4.2 求和符号 4.3 累乘符号 4.4 导数 4.5 偏导数 4.6 矩阵 4.7 指数函数和对数函数 注意&#xff1a;4.6和4.7位于4.2章 第4章 深度学习的数学基础 本章总结一下机器学习所需的数学知识&#xff0c;同时介绍如何在Python中使用…

Multisim电路仿真软件使用教程

安装直接参考这篇文章&#xff1a;Multisim 14.0安装教程 软件管家公众号里有很多软件&#xff0c;需要的可以去找下然后安装&#xff0c;这里用的是14.0版本。 这里有个大神的详细教程&#xff0c;可以参考&#xff1a; Multisim软件使用详细入门教程&#xff08;图文全解&…

【Android12】Android Framework系列--AMS启动Activity分析

AMS启动Activity分析 通过ActivityManagerService(AMS)提供的方法&#xff0c;可以启动指定的Activity。比如Launcher中点击应用图标后&#xff0c;调用AMS的startActivity函数启动应用。 AMS提供的服务通过IActivityManager.aidl文件定义。 // frameworks/base/core/java/an…

mysql数据库文件丢失恢复---惜分飞

客户服务器重启,mysql相关数据文件丢失 通过底层工具进行分析,无法正确恢复数据库名字,一个个单个ibd文件(而且很多本身是错误的) 对于这种情况,通过mysql block扫描恢复出来page文件 恢复出来客户需要数据 这个客户出现该故障的原因大概率是由于文件系统损坏导致.最终…

[ 蓝桥杯Web真题 ]-布局切换

目录 介绍 准备 目标 规定 思路 解法参考 介绍 经常用手机购物的同学或许见过这种功能&#xff0c;在浏览商品列表的时候&#xff0c;我们通过点击一个小小的按钮图标&#xff0c;就能快速将数据列表在大图&#xff08;通常是两列&#xff09;和列表两种布局间来回切换。…

四. 基于环视Camera的BEV感知算法-BEVFormer

目标 前言0. 简述1. 算法动机&开创性思路2. 主体结构3. 损失函数4. 性能对比5. BEVFormerv2总结下载链接参考 前言 自动驾驶之心推出的《国内首个BVE感知全栈系列学习教程》&#xff0c;链接。记录下个人学习笔记&#xff0c;仅供自己参考 本次课程我们来学习下课程第四章—…

【数据结构实践课设】新生报道注册管理信息系统

目录 1.主要框架 2.写入文件 3.读取文件 4.注册学生信息 5.增加学生信息 6.删除学生信息 7.按姓名查询 8.按班级查询 9.按专业查询 10.打印学生信息 11.完整代码 &#x1f308;嗨&#xff01;我是Filotimo__&#x1f308;。很高兴与大家相识&#xff0c;希望我的博客能对你有所…

关于图像清晰度、通透度的描述

1、问题背景 在图像评测过程中&#xff0c;从主观上一般怎么去评判一副图像的优劣呢&#xff1f; 比较显而易见的就是图像的清晰度和通透度&#xff0c;他们决定了评判者对画质的第一印象。 那怎么去理解图像的清晰度和通透度呢&#xff1f;这是本文要描述的内容。 2、问题分…

单调栈结构

单调栈 单调栈是一种特殊设计的栈结构&#xff0c;为了解决如下的问题&#xff1a; 给定一个可能含有重复数值的 arr[]&#xff0c;i位置的数一定存在如下两种信息&#xff1a; arr[i]的左侧离 i 最近并且小于&#xff08;或者大于&#xff09;arr[i] 的数在哪&#xff1f;arr…