Linux中静态库和动态库的使用

这篇具有很好参考价值的文章主要介绍了Linux中静态库和动态库的使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

库的概念

  • 介绍:
    库是一个二进制文件,包含的代码可被程序调用
    标准C库、数学库、线程库…
    库有源码,可下载后编译;也可以直接安装二进制包
    位置一般放在:/lib /usr/lib
  • 库的知识
    库是事先编译好的,可以复用的代码
    在os上运行的程序基本上都要使用库,使用库可以提高开发效率
    window和Linux下库文件的格式不兼容
    Linux下包含静态库和动态库
  • 静态库的特点
    编译时把静态库中相关代码复制到可执行文件中
    程序中已包含代码,运行时不再需要静态库
    程序运行时无需加载库,运行速度更快
    占用更多磁盘和内存空间
    静态库升级后,程序需要重新编译链接
  • 案例如下:
    Linux中静态库和动态库的使用,linux,运维,服务器
    注:此时生成hello.o文件,但不是可执行文件,没有链接库
  • 静态库创建
    静态库
    创建静态库步骤:
    1 . 编写库文件代码,编译为.o 目标文件。
    2. ar 命令 创建 libxxxx.a 文件
    ar -rsv libxxxx.a xxxx.o
    ar 参数如下:
    Linux中静态库和动态库的使用,linux,运维,服务器
    注意:1 静态库名字要以lib开头,后缀名为.a
    2 没有main函数的.c 文件不能生成可执行文件。
    链接错误:
    test.c:(.text+0x15):对‘hello’未定义的引用
    collect2: error: ld returned 1 exit status
    含义:表示hello函数在编译的源码内没有找到实现
    解决:实现代码或者找到对应函数的库并且链接它。
    链接静态库:
    gcc -o 目标文件 源码.c -L路径 -lxxxx
    -L 表示库所在的路径
    -l 后面跟库的名称
  • 案例如下:
    Linux中静态库和动态库的使用,linux,运维,服务器
    注:ar -t .a文件:可以得到是由哪个文件得到的
  • 如何使用上述的静态库
    Linux中静态库和动态库的使用,linux,运维,服务器
    注:出现以下错误是由于没有链接库
    Linux中静态库和动态库的使用,linux,运维,服务器
  • 链接库后得到如下(如果将test可执行文件转移到其他目录下,不依赖库文件,也可以执行):
    Linux中静态库和动态库的使用,linux,运维,服务器
  • 动态库
    编译时仅记录用到哪个共享库中的哪个符号,不复制共享库中相关代码
    程序不包含库中代码,尺寸小
    多个程序可共享同一个库
    程序运行时需要加载库
    库升级方便,无需重新编译程序
    使用更加广泛
  • 共享库创建
    动态库的生成步骤:
    1. 生成位置无关代码的目标文件
      gcc -c -fPIC xxx.c xxxx.c …
    2. 生成动态库
      gcc -shared -o libxxxx.so xxx.o xxx.o …
    3. 编译可执行文件
      gcc -o 目标文件 源码.c -L路径 -lxxxx
  • 代码如下:
    Linux中静态库和动态库的使用,linux,运维,服务器
    注:执行动态库的可执行文件错误
    ./test: error while loading shared libraries: libmyheby.so: cannot open shared object file: No such file or directory
    含义:可执行文件所使用的动态库找不到
    解决办法:
    • 找到动态库,添加到/usr/lib里面
    • 或者使用export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:你的动态库目录,注意在这么加的路径后,只能在当前shell有效
    • 添加在~/.bashrc 文件里面,适用于所有shell,加入export LD_LIBRARY_PATH = LIB_PATH
    • 在/etc/ld.so.conf.d/下加入路径
  • 如何找到一个文件的动态库的名称,如下:
    Linux中静态库和动态库的使用,linux,运维,服务器

文章来源地址https://www.toymoban.com/news/detail-822546.html

到了这里,关于Linux中静态库和动态库的使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • windows下qt使用第三方库(静态链接库lib)、静态库和动态库区别、动态库的使用。

    这里主要是讲述windows下qt使用第三方库。 windows下qt使用第三方库(静态链接库lib)。 为了能够使测试更准确,首先自己用qt创建了一个已经封装好的lib库。 然后让另一个项目去链接这个lib静态库,并且去调用里面的方法。 目的: 使 untitled项目 能够使用 myllplib.lib 静态库,这

    2023年04月17日
    浏览(75)
  • 【linux深入剖析】动态库的使用(续) | 动静态库的链接

    🍁你好,我是 RO-BERRY 📗 致力于C、C++、数据结构、TCP/IP、数据库等等一系列知识 🎄感谢你的陪伴与支持 ,故事既有了开头,就要画上一个完美的句号,让我们一起加油 回顾上节,我们在创建了动态库libmymath.so 我们使用指令 gcc main.c -L. -lmymath -L . (-L + 路径表示myc这个库在哪

    2024年04月15日
    浏览(30)
  • 【Linux】动态库和静态库

    软链接 命令: ln -s 源文件名 目标文件名 软链接是独立连接文件的,他有自己的inode number,有自己的inode属性和内容。 软链接内部存放的是自己所指向文件的路径。 现实中,我们软链接的应用有,例如电脑桌面的快捷模式等。 inode number 不相同 硬链接 命令: ln 源文件目标文件

    2024年02月11日
    浏览(29)
  • Linux之静态库和动态库

    目录 一、前言 二、对于库的理解 三、静态库 四、动态库 五、动静态库的加载 在之前,我们讲了静态库和动态库,详情请跳转:静态库和动态库 下面我们将从工程师的角度,去了解静态库和动态库的形成过程,以及实现它们的制作。并且了解如何将自己的库交给别人,让别

    2024年01月20日
    浏览(26)
  • 关于静态库和动态库的操作

    目录 静态库 动态库 1.增加.o文件: 2.删除.o文件: 查看静态库和动态库中的函数名 1.查看静态库中的函数名(以libexample.a为例): 2. 查看动态库中的函数名(以libexample.so为例): 查看动态库和静态库是32位,还是64位 1.  如果是动态库,可以使用: file *.so   2. 如果是静态库,可

    2024年02月07日
    浏览(27)
  • 静态链接库和动态链接库的区别

    在编译时将库的代码( .lib文件 )和应用程序的代码合并在一起,生成一个单独的可执行文件。 发布时非常方便,直接一个.exe文件即可 库的代码在编译时和链接时与应用程序分开。应用程序包含对库的引用( .lib文件 ,在这里被称为导入库),但不包含库的实际代码。 在 运行

    2024年02月11日
    浏览(29)
  • Linux下动态库和静态库编译实践

    之前写过JNI的文章,在JNI实践过程中,也涉及到对动态库/静态库的一些编译实践,这里统一记录一下。 注意 :-fPIC编译选项可使GCC生成位置无关代码,简单来说生成的代码中的函数与全局变量均为相对地址,通过GOT (Global offset table)来确定其位置,这种方式引入了一层额外的

    2024年01月17日
    浏览(30)
  • 如何在linux下制作静态库和动态库

    静态库顾名思义是静态的,即程序编译链接时,会把静态库的代码链接到可执行文件中。运行时不需要静态库(将静态库删了也能运行)。 相当于静态库的代码复制到了可执行文件中。 分别有如下add.c add.h sub.c sub.h四个文件格式。 首先把.c文件都编译成.o文件。使用下面命令

    2024年01月24日
    浏览(35)
  • linux下g++链接动态库和静态库

    头文件的作用: include的作用就是复制内容到当前文件 井号开头的就是预处理指令,由预处理器处理,预处理阶段不关心代码,只处理预处理指令。 头文件主要 一是为了解决代码都写在一个文件太大了,二是把变量,结构体,函数声明这些固定的放在一起 函数只要声明了,

    2024年02月09日
    浏览(38)
  • Rust : 与C交互动态库和静态库的尝试

    rust调用C端的库函数,有很多方法,场景也有所不同。包括windows还是linux,内置库还是自定义库,还是三方库等等。 一、rust调用其内置的C库 这个很简单,直接把extern \\\"C\\\"引入即可: 比如,在rust端main.rs中: 不需要做其它的处理,直接cargo run 就可以运行。 二、自定义的C库-以

    2024年02月04日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包