如何在linux下制作静态库和动态库

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

静态库(.a)

静态库顾名思义是静态的,即程序编译链接时,会把静态库的代码链接到可执行文件中。运行时不需要静态库(将静态库删了也能运行)。相当于静态库的代码复制到了可执行文件中。

制作静态库

分别有如下add.c add.h sub.c sub.h四个文件格式。
如何在linux下制作静态库和动态库,linux,linux,运维,服务器

  1. 首先把.c文件都编译成.o文件。使用下面命令
//-c 编译到二进制文件就停止
gcc -c add.c -o add.o
gcc -c sub.c -o sub.o
  1. 把.o打包的过程就是形成静态库的过程。使用下面命令:
# ar:archive file 归档文件   -rc:replace create
# libhello.a:lib是前缀名,必须加的;.a是静态库的后缀,必须加;hello是自己库的名字
ar -rc libhello.a add.o sub.o

如何在linux下制作静态库和动态库,linux,linux,运维,服务器

  1. 这样我们的静态库就制作好啦。使用下面的命令可以查看静态库中的目录列表:
# t:列出静态库中的文件
# v:verbose 详细信息
ar -tv libhello.a

如何在linux下制作静态库和动态库,linux,linux,运维,服务器


创建一个makefile来使编译程序简化:
如何在linux下制作静态库和动态库,linux,linux,运维,服务器

如何使用静态库

首先将我们的库函数放在一个文件夹里面:

如何在linux下制作静态库和动态库,linux,linux,运维,服务器
运行完如下图所示:

如何在linux下制作静态库和动态库,linux,linux,运维,服务器

使用:main函数如下:
如何在linux下制作静态库和动态库,linux,linux,运维,服务器

方法一:将该库放到系统搜索的库中。
头文件gcc的默认搜索路径是:/usr/include
库文件的默认搜索路径是:/lib64 or /usr/lib64

  1. 使用如下命令将自己的库,复制到上面目录中:
#复制头文件
sudo cp ./hello/include/* /usr/include/ -rf

# 复制库文件
sudo cp -rf ./hello/lib/* /lib64
  1. 使用该库
    为什么我们使用c语言库不用告诉他链接哪个库呢?
    因为gcc是专门链接C语言的,他自己本身就设定好了,去哪个库找。但是我们自己的库,我们需要自己指定目录。
# -l链接的意思  -lhello链接名字为hello的库
# -static 选择静态链接的方式
gcc main.c -lhello -static    //默认生成a.out
gcc -o main main.c -lhello -static   //指定生成main可执行文件

如何在linux下制作静态库和动态库,linux,linux,运维,服务器

总结:这种方法不推荐,因为涉及到更改系统目录的内容了。
我们再把那俩文件删除:

sudo rm /usr/include/add.h /usr/include/sub.h
sudo rm /lib64/libhello.a

方法2:硬要使用。推荐
直接让gcc找指定路径的指定库。
如下命令:

# -I:指定头文件搜索路径
# -L: 指定库文件搜索路径
# -lhello:指定使用哪个库
gcc -o main main.c -I ./mklib/hello/include/ -L ./mklib/hello/lib/ -lhello

如何在linux下制作静态库和动态库,linux,linux,运维,服务器

方法3:在系统的搜索路径下,创建一个硬链接。也不推荐使用

动态库(.so)

  • 程序在运行的时候才去链接动态库的代码,多个程序共享使用库的代码。
  • 一个动态库链接的可执行文件,仅仅包含用到的函数入口地址的一个表,而不是外部函数所在目标文件的整个机器码。
  • 在可执行文件开始运行之前,外部函数的机器码由操作系统从磁盘上的该动态库中复制到内存中,这个过程称为动态链接。
  • 动态库可以在多个程序间共享,所以动态链接使得可执行文件更小,节省了磁盘空间,OS采用虚拟内存机制允许物理内存中的一份动态数据库被要用到该库的所有进程共用,节省了内存和磁盘空间。

制作动态库

  1. 首先将.c文件变成与位置无关的二进制.o文件。
# -fPIC: 与二进制无关选项
gcc -fPIC -c add.c -o add_d.o
gcc -fPIC -c sub.c -o sub_d.o

如何在linux下制作静态库和动态库,linux,linux,运维,服务器

  1. 将.o文件打包成动态库
# -shared:动态库选项
# libhello.so:lib是前缀,.so是后缀, hello是动态库名字
gcc -shared add_d.o sub_d.o -o libhello.so

如何在linux下制作静态库和动态库,linux,linux,运维,服务器

这样我们的动态库就制作成功啦。

如何使用动态库(.so)

首先写一个makefile方便制作动态库。

如何在linux下制作静态库和动态库,linux,linux,运维,服务器

hello文件结构如图所示:
如何在linux下制作静态库和动态库,linux,linux,运维,服务器

仍然用静态库的那个命令(不加static了,默认就是动态链接),如下:

如何在linux下制作静态库和动态库,linux,linux,运维,服务器
**解释:**我们实际上用的方法是对的,也告诉gcc使用hello的库了,并且默认也是动态链接。但是还是无法执行。是因为,我们只是告诉gcc了,但是没有告诉os,os在执行此动态库时,并不知道要去哪里把动态库搬进内存。因此我们要告诉,os去哪里找这个动态库。

方法一:添加系统变量

  • OS使用LD_LIBRARY_PATH加载环境变量。
    将自己的库的绝对路径,添加到环境变量即可。
# 注意添加库的路径即可。
export LD_LIBRARY_PATH=$LD_LIBRARY:/home/xty/cplusplus/linux/20140110/mklib/hello/lib

如何在linux下制作静态库和动态库,linux,linux,运维,服务器
总结:不持久,重新登录一次就又不能用了。因为环境变量会重新加载,我们弄得是临时的环境变量。

方法二:修改配置文件

# 创建一个mylib.conf 配置文件,直接把库的绝对路径写入即可。
sudo vim /etc/ld.so.conf.d/mylib.conf
# 更新缓存
sudo ldconfig

总结:持久,推荐使用。

方法三:使用软链接也可以
在/lib64/目录里面,创建一个libhello.so软链接,链接库文件的地址。这个方法请读者自行实现,但是也不推荐,因为同样更改了系统目录内容。文章来源地址https://www.toymoban.com/news/detail-820660.html

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

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

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

相关文章

  • Linux下动态库和静态库编译实践

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

    2024年01月17日
    浏览(43)
  • Linux中静态库和动态库的使用

    介绍: 库是一个二进制文件,包含的代码可被程序调用 标准C库、数学库、线程库… 库有源码,可下载后编译;也可以直接安装二进制包 位置一般放在:/lib /usr/lib 库的知识 库是事先编译好的,可以复用的代码 在os上运行的程序基本上都要使用库,使用库可以提高开发效率

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

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

    2024年02月09日
    浏览(52)
  • Linux—Web服务器(静态、动态网站的搭建)

    1.1www所用的协议 HTTP超文本传输协议,是互联网上最广泛的一种网络协议,所有的www文件都必须遵守这个标准 它是建立在TCP上一种的无状态连接,整个基本的工作流程是客户端发送一个HTTP请求,说明客户端想要访问的资源和请求的动作,服务端收到请求之后,服务端开始处理

    2024年02月06日
    浏览(55)
  • Linux操作命令&静态库和动态库区别&大小端&孤儿僵尸进程

    cd:切换当前目录 ls:查看当前文件与目录 grep:通常与管道符命令一起使用,用于对一些命令的输出进行筛选和加工 cp:复制文件或文件夹 mv:移动文件或文件夹 rm:删除文件或文件夹 ps:查看进程情况 kill:向进程发送信号 tar:对文件进行打包 cat:查看文件内容 top:查看

    2024年02月16日
    浏览(42)
  • Linux下gcc编译,动态库和静态库,makefile,gdb调试

    展开头文件, 宏替换(变量宏、函数宏)、替换空格等 逐行检查程序中出现的语法错误,简单的逻辑错误 将 .s 汇编文件中所有的汇编指令翻译成二进制机器码(下面就是来了个截图,二进制显示了乱码) 将 .o 的目标文件,链接库文件、数据段合并,地址回填(把汇编里相

    2024年02月08日
    浏览(51)
  • 详解Linux下静态库/动态库的生成和使用(含代码示例和操作流程)&&动态库和静态库的区别

    关于gcc的使用方法可以参考下方链接博客: Linux下详解gcc编译过程(含代码示例) gcc使用教程 库是一种组件技术。 库里封装了数据和函数,提供给用户程序调用。 库只执行到第三阶段编译,没有链接。 库的使用可以使程序模块化,提高程序的编译速度,实现代码复用。

    2024年02月15日
    浏览(45)
  • 【探索Linux】—— 强大的命令行工具 P.13(文件系统 | 软硬链接 | 动态库和静态库)

    在计算机科学领域中,Linux 系统一直以来都是备受推崇的操作系统之一。其中,文件系统、软硬链接、动态库和静态库是 Linux 系统中非常重要的概念,在实际应用中扮演着不可或缺的角色。 在上一篇文章中,我们了解了 Linux 系统中文件描述符、重定向以及基础 IO 操作的相关

    2024年02月04日
    浏览(55)
  • 【Linux系统编程】Linux下的编译器——gcc/g++的使用 及 动态库和静态库的认识

    这篇文章我们继续学习Linux中的开发工具,今天要学的是: Linux下的编译器——gcc/g++ 我们先来简单了解一下它们的概念: gcc (GNU Compiler Collection) 和 g++ 是 Linux 系统上最常用的编译器。它们是 GNU 组织开发的一套开源编译器工具集。 gcc: gcc 是 GNU 编译器集合中的 C 语言编译器。

    2024年02月16日
    浏览(44)
  • 动态库和静态库

    1. 静态库(.a):程序在编译链接的时候把库的代码链接到可执行文件中。程序运行的时候将不再需要静态库。 2. 动态库(.so):程序在运行的时候才去链接动态库的代码,多个程序共享使用库的代码。 3. 一个与动态库链接的可执行文件仅仅包含它用到的函数入口地址的一个

    2024年02月09日
    浏览(31)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包