在linux下制作静态库和动态链接库的方法

简介: 在linux下制作静态库和动态链接库的方法

静态库 .o文件的集合

 制作

ar -cr libxxx.a  xxx1.o xxx2.o xxx3.o ...

 编译

gcc main.c -l xxx [-L 库路径] (如果不加-L则在标准库路径下查找)

 运行

./a.out

基本概念:

静态库又称为文档文件(Archive File)。它是多个.o文件的集合。Linux中静态库文件的后缀为"a"。

静态库的代码在编译时就已经链接到应用程序中

静态库中的各个成员(.o文件)没有特殊的存在格式,仅仅是一个.o文件的集合。

使用"ar"工具维护和管理静态库

 

ar的三个参数中:r代表将文件插入归档文件中,c代表建立归档文件,s代表若归档文件中包含了对象模式,可利用此参数建立备存文件的符号表。

lib和.a都是系统指定的静态库文件的固定格式,mylib才是静态库的名称,

编译时,链接器会在标准路径(/usr/lib;/lib)或者用户指定的路径下去找.a的文件。

gcc -o main main.c -static -L. –lmylib

-static指定编译器链接静态库,-L.指定静态库的路径为当前路径,

在gcc编译器中引用可搜索到的目录和库文件时需用(-l+库名),

如在gcc中加入-lm可以在程序汇中链接标准算术库,加上-lpthread可以链接到linux标准线程库

 

总结:

   使用静态库可以使程序不依赖于任何其他库而独立运行,但是会占用很多内存空间以及磁盘空间,

   而且如果库文件更新,则需重新编译源代码,使用起来不够灵活.其实,编译的时候不需要加-static,

   直接用gcc -o main main.c -L. –lmylib,连接器会为我们链接指定的静态库以及标准C的共享库。

 

============================================

动态库 并不包含在可执行文件中 在执行时才加载动态库

 制作  

gcc -shared -fPIC xxx.c -o libxxx.so

 编译

gcc main.c -l xxx [-L 编译时库路径]

 临时指定运行时的库查找路径  

[LD_LIBRARY_PATH=(运行时库路径)] ./a.out

           如果不指定则在标准路径下找

 当你发布库要标准路径“/usr/lib  或 /lib”就不需要其它操作,但

 gcc 时一定要加“-l”指定的库名

 

永久修改运行时的库查找路径

/etc/ld.so.conf   修改连接器的配置文件
ldconfig          使配置文件生效

3、编译参数解析

最主要的是GCC命令行的一个选项:

     -shared 该选项指定生成动态连接库(让连接器生成T类型的导出符号表,有时候也生成弱连接W类型的导出符号),不用该标志外部程序无法连接。相当于一个可执行文件

 

    -fPIC:表示编译为位置独立的代码,不用此选项的话编译后的代码是位置相关的所以动态载入时是通过代码拷贝的方式来满足不同进程的需要,而不能达到真正代码段共享的目的。

 

    -L.:表示要连接的库在当前目录中

 

    -ltest:编译器查找动态连接库时有隐含的命名规则,即在给出的名字前面加上lib,后面加上.so来确定库的名称

 

    LD_LIBRARY_PATH:这个环境变量指示动态连接器可以装载动态库的路径。

 

    当然如果有root权限的话,可以修改/etc/ld.so.conf文件,然后调用 /sbin/ldconfig来达到同样的目的,

    不过如果没有root权限,那么只能采用输出LD_LIBRARY_PATH的方法了。

目录
相关文章
|
1月前
|
Ubuntu 物联网 Linux
从零安装一个Linux操作系统几种方法,以Ubuntu18.04为例
一切就绪后,我们就可以安装操作系统了。当系统通过优盘引导起来之后,我们就可以看到跟虚拟机中一样的安装向导了。之后,大家按照虚拟机中的顺序安装即可。 好了,今天主要介绍了Ubuntu Server版操作系统的安装过程,关于如何使用该操作系统,及操作系统更深层的原理,还请关注本号及相关圈子。
|
1月前
|
缓存 监控 Linux
Linux系统清理缓存(buff/cache)的有效方法。
总结而言,在大多数情形下你不必担心Linux中buffer与cache占用过多内存在影响到其他程序运行;因为当程序请求更多内存在没有足够可用资源时,Linux会自行调整其占有量。只有当你明确知道当前环境与需求并希望立即回收这部分资源给即将运行重负载任务之前才考虑上述方法去主动干预。
516 10
|
1月前
|
Ubuntu Linux 图形学
推广与体验Ubuntu Linux的便捷方法
如果你的朋友或家人对尝试Linux感兴趣,但希望在安装之前先体验一下,你可以分享以下链接给他们:Ubuntu在线导览。通过这个链接,他们可以在任何地方轻松体验Ubuntu,无需安装即可深入了解这个流行的操作系统。
|
1月前
|
XML 缓存 Linux
在Linux环境下解决Visual Studio Code字体显示异常和字体替换方法。
解决Linux下VS Code字体显示异常,需要对Linux字体渲染机制有所理解,并对VS Code的配置选项进行合理设置。替换字体时则要通过系统字体配置或VS Code设置来完成。通过上述方法,可以有效地解决字体显示问题,从而提升代码编辑的视觉体验。
178 0
|
4月前
|
NoSQL Linux 编译器
GDB符号表概念和在Linux下获取符号表的方法
通过掌握这些关于GDB符号表的知识,你可以更好地管理和理解你的程序,希望这些知识可以帮助你更有效地进行调试工作。
197 16
|
2月前
|
网络协议 Ubuntu Linux
Wireguard in Linux的安装方法
本文介绍了如何在Ubuntu和Rocky Linux中安装配置WireGuard,并探讨了配置过程中可能出现的DNS泄露问题及解决方法,包括通过nmtui设置DNS及调整DNS优先级参数。
|
5月前
|
Linux Shell
Linux系统下快速批量创建和删除文件的方法
总的来说,使用shell脚本来批量处理文件是一种非常强大的工具,只要你愿意花时间学习和实践,你会发现它能大大提高你的工作效率。
308 19
|
3月前
|
Linux 编译器 vr&ar
Linux的动态库与静态库
静态库在编译时直接嵌入到最终的可执行文件中。
88 0
|
5月前
|
Ubuntu Linux 网络安全
如何在Linux中更改主机名?修改主机名最新方法
本期教程将指导您如何在Linux系统中更改主机名。主机名是Linux系统的常用功能,用于识别服务器,帮助区分不同服务器,并与网络进程和其他应用程序协同工作。教程涵盖显示当前主机名的方法(通过`hostname`命令),以及在CentOS 7、Debian 9和Ubuntu 16.04及以上版本中更改主机名的步骤(使用`hostnamectl set-hostname`命令)。对于其他Linux版本,可编辑`/etc/hostname`文件实现更改。记得重启相关服务或服务器以使更改生效!
1421 12