13-3 动态链接库的编译和使用

2023-11-15

1. 静态链接库与动态链接库

        由于静态链接库不能共享,且依赖的符号的对应目标文件与主程序文件需要一同编译,故静态链接库内存空间占用较大。而动态链接库具有共享性质,通过特定路径即可引用,可以有效减少内存空间的占用

        此外,可使用 ldd 命令查看一个可执行程序所依赖的动态链接库

 2. 编译动态链接库

        以主程序文件 03.shared_library.c 为例,编译运行时需要的动态链接库,便于后续外部函数的执行。此主程序文件与上一小节的主程序文件内容相同。

#include <stdio.h>

#include "mathutils/include/factorial.h"
#include "mathutils/include/fibonacci.h"

int main(){

  printf("Factorial(4): %d\n", Factorial(4));
  printf("Fibonacci(8): %d\n", Fibonacci(8));

  return 0;
}

         编译动态链接库的具体流程为

                1)准备工作,创建 mathutils 文件夹及相应的 .h 头文件和 .c 文件。

                2)将主程序文件 03.shared_library.c 中引用的外部函数的所在 .c 文件(factorial.c fibonacci.c)编译为动态链接库。在 Linux 系统中,输入 gcc -shared -fPIC factorial.c fibonacci.c -o libmathutils.so,即可生成动态链接库 libmathutils.so。而在 Windows 系统中,需要额外添加导入库参数才能生成动态链接库。整体代码为 gcc -shared -fPIC -Wl,--out-implib,libmathutils.a factorial.c fibonacci.c -o libmathutils.dll,生成动态链接库 libmathutils.dll。

                -shared 参数表示生成共享库,即动态链接库。-fPIC 参数用来生成与地址无关的代码。因为动态链接库编译时无法确定符号运行时的地址,只能基于全局偏移表给出相对位置,而全局偏移表只能等到程序加载运行时才能确定。

              此外,可使用  ar t 命令查看导入库内部的文件,使用 objdump -t 命令查看动态链接库内部的文件。可以发现此处的导入库文件内部与上一小节的静态链接库内容不同,且动态链接库中存在 Factorial() 和 Fibonacci() 函数的相关内容。(grep 用来查找指定格式的字符串,其使用方法见:https://www.cnblogs.com/yychuyu/p/13624485.html

3. 使用动态链接库

        动态链接库编译完成后,主程序文件需要使用动态链接库进行程序的编译和执行。具体流程如下:

                1)编译主程序文件,注意参数 -Lmathutils -lmathutils。其中 -L 连接的是动态链接库路径 mathutils-l 连接的是动态链接库名称 libmathutils,但由于 lib 通常省略,故为 mathutils。

                 2)此时若直接执行 03.shared_library,其结果会如下图所示:无法找到动态链接库 libmathutils.dll。其原因在于执行程序时并未指定动态链接库的路径(编译时指定了路径)。Windows 系统下动态链接库的默认查找逻辑为:首先在当前目录下找寻待使用的动态链接库,如果未找到,则去系统的 path 路径下去找。此处 libmathutils.dll 在 Chapter13/mathutils 文件夹中,而执行程序在 Chapter13 文件夹中,故无法找到相应的动态链接库。

                 解决方法为跳转至 mathutils 文件夹下执行 03.shared_library 程序,其结果为:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

13-3 动态链接库的编译和使用 的相关文章

随机推荐

  • VueUse中文文档Vue官方工具库

    VueUse官网地址https vueuse org 这里就列举常用工具详情请去官网 查看所有API 浏览器 useFullscreen全屏展示 isFullscreen 当前是否是全屏 toggle 是函数直接调用即可 const isF
  • Visual Studio 2022 创建C++项目

    打开Visual Studio 创建新项目 选择平台 选择空项目 点击下一步 设置项目名称以及指定项目文件位置 点击创建 创建成功后 如下图 在源文件中添加代码文件 写入代码 运行代码 F5 运行结果界面如下图所示
  • c语言模板类,C++类模板(Class Template)

    C 除了支持函数模板 还支持类模板 Class Template 函数模板中定义的类型参数可以用在函数声明和函数定义中 类模板中定义的类型参数可以用在类声明和类实现中 类模板的目的同样是将数据的类型参数化 声明类模板的语法为 templat
  • 深度学习论文精读[9]:PSPNet

    场景解析 scene parsing 是语义分割的一个重要应用方向 区别于一般的语义分割任务 场景解析需要在复杂的自然图像场景下对更庞大的物体类别的每一个像素进行分类 场景解析在自动驾驶和机器人感知等方向应用广泛 但由于自然场景的复杂性 语
  • 在Windows 10上安装TensorFlow及PyCharm开发环境

    有时候在查看官方文档时 常常看到很多的分支 所以作为开发者我们都喜欢把最佳实践总结出来 下面一起来看看如何在Windows 10上安装一个TensorFlow和PyCharm开发环境 安装Anaconda 安装Anaconda以后 即可获得
  • Image Super-Resolution Using Very Deep Residual Channel Attention Networks

    因为我是语义分割方向 对图像超分辨率不了解 这里简单记录一下读论文的收获 论文地址 超分辨率的输入是低分辨率 最终恢复超分辨率图片 作者发现低分辨率的图片拥有丰富的低频细节 对应图像中大块的平坦区域 然而低分辨率的每个通道在处理时候总是平等
  • depot_tools安装过程

    depot tools安装过程 使用torserviseSVN 1 6 6版本 移除其它版本 Install the depot tools Chromium and Chromium OS use a package of scripts
  • 数据结构——线性表(C++)

    一 前言 数据结构在逻辑结构上分为线性和非线性 例如链表 顺序表 串 数组都是线性的 他们的特点就是一对一 而非线性结构比如图和二叉树 他们的对应关系是一对多 多对多 这里介绍线性表的顺序表和链表 循环链表和双向链表 还有双向循环链表 链表
  • 关于springboot profiles

    在项目中会遇到项目环境变量切换到的问题 但是主要配置相同 只想切换部分的配置 可以在application yml配置所有的环境变量 然后在application dev yml配置dev中的环境变量 如果dev中没有配置会读取applic
  • tan x x的matlab求解,matlab画x=tan(x)

    matlab怎么解非线性方程 如tan x 4x x 2 4 equ sym tan x 4 x x 2 4 x solve equ gt gt xx 0再问 这只能求出一个解啊再答 还有其他解吗 matlab 求解tan x x 1 0
  • Rotated_Faster_Rcnn

    rotated faster rcnn 文章目录 训练 rpn head forward train rpn head forward rpn head loss rpn head get bboxes roi head forward t
  • mysql绿色版安装与卸载

    第一步 下载Mysql 官网下载地址 https dev mysql com downloads mysql 1 鼠标滑下来 找到Other Download中的 Windows x86 64 bit ZIP Archive 点击其右边的D
  • 第32步 机器学习分类实战:SHAP

    继续填坑 这回到SHAP 这个是选修 有兴趣可以看看 我们建立了十个ML模型 如果选出了Xgboost LightGBM Catboost这种树模型 大概率也是这些最厉害了 那就可以用SHAP进行模型可视化 1 首先 使用pip insta
  • 解决“The debugger has set two breakpoints at the same address 0x08xxxxx”问题

    今天来分享一个前段时间做项目适合遇到的一个bug 正好今天有空就拿出来跟大家分享一下 错误 首先 大家直接来看这个错误提示 这个错误是我在使用J Link调试时候出现的 上面的意思是 调试器在同一地址设置了两个断点 但是我检查了整个工程也没
  • 数据结构编程回顾(五)交通咨询系统设计

    题目五 交通咨询系统设计 设计要求 设计一个咨询交通系统 能让旅客咨询从任一个 城市到另一个城市之间的最短路径 里程 最低费用或者 最少时间等问题 对于不同的咨询要求 可以输入城市间路 程 所需时间或者所需费用 设计分3 个部分 1 建立交
  • QT connect第五个参数

    一 介绍 1 Qt AutoConnection 默认连接 连接类型在信号发出时确定 如果接收者和发送者在同一个线程 使用Qt DirectConnection类型 如果接收者和发送者不在一个线程 则使用Qt QueuedConnectio
  • 管理概论笔记

    前言 本文章属于在听课时做的笔记 第一周 管理导论 来源 管理概论 浙江大学 邢以群 MOOC 学习理论的目的是为了能够做没有学过的人做不了的事情或者比他们做得更好 一 管理及其功能 介绍什么是管理以及为什么需要管理 观念决定行为 行为决定
  • GBDT的正则化及与XGBOOST区别

    1 GBDT的正则化 和Adaboost一样 我们也需要对GBDT进行正则化 防止过拟合 GBDT的正则化主要有三种方式 第一种是和Adaboost类似的正则化项 即步长 learning rate 定义为 对于前面的弱学习器的迭代 fk
  • Shiro中Session和Cache

    Session是一种状态保持机制 参考文章Session是什么可知Session和Web服务也没有必然关系 Shiro本身的Security Manager也可以脱离Servlet自己管理Session 根据Security Manager
  • 13-3 动态链接库的编译和使用

    1 静态链接库与动态链接库 由于静态链接库不能共享 且依赖的符号的对应目标文件与主程序文件需要一同编译 故静态链接库内存空间占用较大 而动态链接库具有共享性质 通过特定路径即可引用 可以有效减少内存空间的占用 此外 可使用 ldd 命令查看