linux静态库、linux动态库制作、使用,动态库报错:error while loading shared libraries: libxxx.so: cannot open shared o

2023-05-16

接上一篇:linux_C/C++程序编译-gcc编译器基础使用、编译阶段、编译优化、命令大全(g++适用)

本次来分享linux下C/C++程序的静态库和动态库的制作和使用,不废话,上菜:

目录

  • 1.linux静态库
    • 1.1.linux静态库说明
    • 1.2.linux静态库命名格式
    • 1.3.linux静态库制作
    • 1.4.使用静态库
      • 1.4.1.方法1
      • 1.4.2.方法2
  • 2.linux动态库(共享库)
    • 2.1.linux动态库说明
    • 2.2.linux动态库命名格式
    • 2.3.linux动态库制作
      • 2.3.1.生成“与位置无关”的目标文件(.o文件)
      • 2.3.2.制作动态库
      • 2.3.3.使用动态库
    • 2.4.(问题)动态库报错:找不到
      • 2.4.1.执行生成的可执行文件
      • 2.4.2.解决方案--四种方法
        • (1)临时解决
        • (2)永久解决
        • (3) 永久解决(正规写法)

1.linux静态库

1.1.linux静态库说明

  linux的静态库是以.a结尾的,而windows的静态库是以.lib结尾的,本次来介绍的是linux的静态库。
1、优点
   ①寻址方便,加载速度快
   ②库被打包到可执行程序中,直接发布可执行程序即可使用
2、缺点
   ①静态库的代码在编译过程中已经被载入可执行程序,因此体积较大。
   ②如果静态函数库改变了,那么你的程序必须重新编译。
3、使用场合
   ①在核心程序上使用,保证速度,可忽视空间
   ②主流应用于80、90年代,现在很少用

1.2.linux静态库命名格式

静态库命名方式:
  libsort.a   #lib开头,sort静态库名,.a结尾

1.3.linux静态库制作

1、gcc/g++命令生成 *.o文件
使用gcc/g++编译器命令:

gcc a.c b.c c.c -c	#生成二进制文件a.o、b.o、c.o

接下来就要用这些.o文件打包成静态库了。

gcc/g++编译器学习

2、ar打包,得到静态库 libmytest.a

ar rcs libmytest.a a.o b.o c.o 	#使用ar工具将需要的.o打包,若是该目录下有不需要的.o文件,就不要将其打包进来,

若是没有不要的.o文件,也可写成命令:
  ar rcs libmytest.a \*.o

(就是一个打包.o文件的过程)

ar 工具不包含在gcc中
参数说明:

r --> 将文件插入静态库中
c --> 创建静态库,不管库是否存在
s --> 写入一个目标文件索引到库中,或者更新一个存在的目标文件索引。

查看库中的符号(.o文件、函数、全局变量等)命令: nm libmytest.a

注意:自己写程序调用别人的静态库时,可执行文件中只打包使用到的别人的静态库中的.o文件,没有使用到的.o是不被打包到自己的程序里的,即生成的二进制文件是与位置有关的,调用的静态库里的.o会被直接打包进自己写的程序可执行文件中(而动态库不会,动态库只是做了一个位置的记录)。

如图:
在这里插入图片描述

1.4.使用静态库

1.4.1.方法1

命令格式:
  gcc + 源文件 + -L 静态库路径 + -l 静态库名 + -I头文件目录 + -o 可执行文件名

参数说明:
-L --> 指定库所在的路径
-l --> 指定库的名字(小写的l)
	去掉前缀 lib
	去掉后缀 .a
	只留下中间部分
-I --> 头文件目录位置(大写的i)

例如:

gcc main.c -L ./ -l mytest -I ./ -o app	#使用静态库编译程序

1.4.2.方法2

命令格式:
  gcc + 源文件 + -I头文件 -o 可执行文件名称 +路径/libxxx.a
例如:

gcc main.c -I ./ -o app ./mylib/libxxx.a	#使用静态库编译程序

注:生成的静态库需要跟对应的头文件同时发布,头文件中存放的是函数接口(函数声明)

2.linux动态库(共享库)

2.1.linux动态库说明

  linux的动态库是以 .so 结尾的,而windows的动态库是以**.dll** 结尾的,现在来介绍的是linux的动态库(也有的人叫共享库)。

1、机制
   动态库的代码是在可执行程序运行时才载入内存的,在编译过程中仅简单的引用,因此代码体积较小。
2、优点

①节省内存(共享)
②易于更新(动态链接)
	停止运行程序,使用新库覆盖旧库(保证新旧库名称一致,接口一致) “接口”,重新启动程序。

3、缺点
   延时绑定,速度略慢
4、使用场合
   对速度要求不是很强烈的地方都应使用动态库

注意:动态库是否加载到内存,取决于程序是否运行。

2.2.linux动态库命名格式

命令格式:
  libmytest.so   #lib开头,动态库名,.so 结尾

2.3.linux动态库制作

  linux动态库制作和使用,会遇到一些问题,不过这些都不难,博主都给出了简易的解决方案,只需要按照博主的步骤,按部就班就可以解决问题。

2.3.1.生成“与位置无关”的目标文件(.o文件)

命令使用:
gcc -fPIC a.c b.c c.c -c
  参数 -fPIC 表示生成与位置无关代码,用的相对地址(生成的.o文件)
  执行完毕后生成一系列的 .o 文件

  调用动态库时,并不会将调用到对应动态库中.o文件打包到自己写的程序可执行文件中,而是对动态库的位置做了记录,是程序起来了再去加载动态库 (静态库则是不一样,会将.o打包到自己的可执行程序文件中)

2.3.2.制作动态库

使用gcc/g++编译器命令:
gcc -shared -o libmytest.so a.o b.o c.o
  参数:-shared 制作动态库
  -o:生成动态库文件的名称
或:gcc -shared -o libmytest.so \*.o   #打包当前路径下的所有.o文件为动态库,注意,若是当前路径下有无关的.o,也会被打包进去,所以使用*.o的时候最好将当前路径下的无关.o移出去

2.3.3.使用动态库

使用gcc/g++编译器命令:
  gcc main.c -L./ -lmytest -I./ -o app
说明:
  -L --> 指定库所在的路径,
  -l --> 去掉前缀 lib,去掉后缀 .so,只留下中间部分
  -I --> 头文件目录位置

2.4.(问题)动态库报错:找不到

2.4.1.执行生成的可执行文件

  在使用动态库以后,生成自己的可执行文件myapp会运行失败。
报错:
error while loading shared libraries: libxxx.so: cannot open shared object file: No such file or directory
原因:动态库找不到。
./myapp --> 运行失败

这时候我们可以去查看myapp依赖的共享库,查看依赖的共享库命令:ldd myapp

如图:
在这里插入图片描述

问题原因:发现.so找不到,是因为没有给动态链接器(ld-linux.so.2)指定好动态库 libmytest.so 的路径。

/ld-linux-x86-64.so.2:动态链接器,按照这种规则去调用我们的动态库。

2.4.2.解决方案–四种方法

(1)临时解决

  使用命令:export LD_LIBRARY_PATH=库路径,将当前目录加入环境变量,但是终端退出了就无效了。(适用于代码测试)

LD_LIBRARY_PATH介绍:
1、作用

①指定查找共享库(动态链接库)时除了默认路径之外的其他路径
②该路径在默认路径之前查找

2、设置方法
用export命令来设置值
例如:

export LD_LIBRARY_PATH=./mylib		#设置mylib文件夹路径为我们动态库所在的路径
echo $LD_LIBRARY_PATH	#打印该环境变量

(2)永久解决

  export LD_LIBRARY_PATH=./mylib写入家目录下.bashrc文件中,这样就可以永久设置了。
  修改了bashrc文件后,需要将终端关掉再次打开,该文件才能生效。

(3) 永久解决(正规写法)

步骤:

1. 需要找动态连接器的配置文件 --  /etc/ld.so.conf
2. 动态库的路径写到配置文件中 -- 绝对路径,例如:/home/myproject/mylib
3. 终端使用命令更新:sudo ldconfig -v

以上就是本次的分享了,希望能对广大网友有帮助。

此博主在CSDN发布的文章目录:【我的CSDN目录,作为博主在CSDN上发布的文章类型导读】

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

linux静态库、linux动态库制作、使用,动态库报错:error while loading shared libraries: libxxx.so: cannot open shared o 的相关文章

随机推荐

  • cuda-trt 学习

    https github com jinmin527 learning cuda trt learning cuda trt A large number of cuda tensorrt cases在这个project中 xff0c 提供
  • 时序知识图谱推理:Know-Evolve: Deep Temporal Reasoning for Dynamic Knowledge Graphs

    0摘要 xff1a 带有时间戳的大规模事件数据的可用性催生了边带有时间的动态知识图谱 在动态的知识图谱中 xff0c 并没有被很好的理解 基于此 xff0c 本文提出Know Evolve xff0c 这是一种新颖的深度进化知识网络 xff
  • 《机器学习实战》源码和数据集的下载

    机器学习实战 这本书对于我们了解机器学习原理和代码实现提供了很大的帮助 xff0c 源码和数据集可在其英文版的官方网站进行下载 xff1a https www manning com books machine learning in ac
  • VNC Viewer :Timed out waiting for a response from the computer

    阿里云主机 xff0c Ubuntu系统 xff0c 通过VNC viewer连接出现超时问题 解决方案 xff1a 首先检查在阿里云主机添加5801 5810 xff1b 5901 5910端口是否开启 查找步骤如下图 xff1a 1 点
  • 从零开始系列(二):数据库基础篇

    从零开始系列 xff08 二 xff09 xff1a 数据库基础篇 相关系列文章推荐 xff1a 从零开始系列 xff08 一 xff09 xff1a 在github上搭建自己的博客 从零开始系列 xff08 三 xff09 xff1a W
  • 从零开始系列(三):Windows10安装Linux子系统(WSL教程)

    从零开始系列 xff08 三 xff09 xff1a Windows10安装Linux子系统 xff08 WSL教程 xff09 相关系列文章推荐 xff1a 从零开始系列 xff08 一 xff09 xff1a 在github上搭建自己的
  • 从零开始系列(四):一文看懂arm架构和x86架构有什么区别

    从零开始系列 xff08 四 xff09 xff1a 一文看懂arm架构和x86架构有什么区别 相关系列文章推荐 xff1a 从零开始系列 xff08 一 xff09 xff1a 在github上搭建自己的博客 从零开始系列 xff08 二
  • NVIDIA显卡及架构介绍

    版权申明 未经博主同意 xff0c 谢绝转载 xff01 xff08 请尊重原创 xff0c 博主保留追究权 xff09 xff1b 本博客的内容来自于 xff1a NVIDIA显卡及架构介绍 xff1b 学习 合作与交流联系q384660
  • 脉冲神经网络资料汇总

    往期文章推荐 xff1a 损失函数与代价函数 神经网络从入门到精通 脉冲神经网络综述笔记 版权申明 未经博主同意 xff0c 谢绝转载 xff01 xff08 请尊重原创 xff0c 博主保留追究权 xff09 xff1b 本博客的内容来自
  • 什么是NAS

    一 NAS是什么 简单的说就是连接在网络上 xff0c 让大家可以透过网络 xff08 内网 xff0c 外网 xff09 来进行储存和读取资料的设备 通俗点说 xff0c 就是有一台很小很小的台式主机 xff0c 里面只装了很多颗的磁盘
  • numba安装与使用

    一 numba是什么 Numba是一个针对Python的开源JIT编译器 xff0c 由Anaconda公司主导开发 xff0c 可以对Python原生代码进行CPU和GPU加速 Numba对NumPy数组和函数非常友好 解释器可以参考第四
  • 目标检测中算法评价指标FPS

    一 FPS 每秒传输帧数 Frames Per Second 是什么 FPS就是目标网络每秒可以处理 xff08 检测 xff09 多少帧 多少张图片 FPS简单来理解就是图像的刷新频率 xff0c 也就是每秒多少帧 假设目标检测网络处理1
  • pytorch版本对计算能力的要求

    一 pytorch对计算能力要求 首先查看pytorch是否可用cuda完整流程应该是先查看是否在当前环境下的python In span class token punctuation span span class token numb
  • 在VS2013中配置boost_1_58_0过程和遇到的的问题

    Boost是为C 43 43 语言标准库提供扩展的一些C 43 43 程序库的总称 Boost库是一个可移植 提供源代码的C 43 43 库 xff0c 作为标准库的后备 xff0c 是C 43 43 标准化进程的开发引擎之一 xff0c
  • C语言学习专栏(1):易忘点

    C语言学习专栏系列 xff1a 版权申明 未经博主同意 xff0c 谢绝转载 xff01 xff08 请尊重原创 xff0c 博主保留追究权 xff09 xff1b 本博客的内容来自于 xff1a C语言学习专栏 xff08 1 xff09
  • git如何配置模板文件

    git如何创建模板文件 创建xxx template文件 xff0c 其内容为团队制定的Git提交注释规范 xff0c 如 xff1a Desgraption Date Author 通过git config命令配置commit templ
  • iOS很坑的error:

    iOS错误如下 error using bridging headers with module interfaces is unsupported 仔细看好错误类型 xff0c 是关于swift混合编译问题 解决办法 完美解决 xff0c
  • 使用Hexo搭建个人博客,绑定GitHub以及个人域名

    文章目录 前言安装Git安装Nodejs安装Hexo创建一个根目录安装Hexo验证安装是否成功初始化网址安装网址依赖开启本地服务 托管到Git配置git的SSH在github上配置秘钥 托管到GitHub配置仓库地址hexo安装部署的命令验
  • ubuntu定时任务的设置

    ubuntu 定时执行任务需要进行如下操作 xff1a span class token comment 使用 crontab 添加定时任务 span span class token comment 1 打开定时任务 span span
  • linux静态库、linux动态库制作、使用,动态库报错:error while loading shared libraries: libxxx.so: cannot open shared o

    接上一篇 xff1a linux C C 43 43 程序编译 gcc编译器基础使用 编译阶段 编译优化 命令大全 g 43 43 适用 本次来分享linux下C C 43 43 程序的静态库和动态库的制作和使用 xff0c 不废话 xff