温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

linux静态库和动态库的创建与使用方法

发布时间:2021-07-26 23:20:17 来源:亿速云 阅读:383 作者:chen 栏目:系统运维

这篇文章主要介绍“linux静态库和动态库的创建与使用方法”,在日常操作中,相信很多人在linux静态库和动态库的创建与使用方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”linux静态库和动态库的创建与使用方法”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

静态库与动态库的创建与使用

linux静态库和动态库的创建与使用方法

1. 基本概念

静态库:链接时,库与编译生成的 .o 文件一起打包到可执行文件中。 linux / windows 下扩展名分别为:.a / .lib
动态库:链接时,不会打包到可执行文件中, 执行时会动态的加载动态库。 linux / windows 下扩展名分别为:.so / .dll

区别主要体现在:

a、可维护性。
合入更新。合入动态库的更新,只要替换库即可。但合入静态则需要重新链接,生成新的可执行程序,全量更新。
环境依赖。若包含静态库,编译成功后不依赖环境。动态库则存在依赖关系,需要环境中存在对应的动态库。
b、大小
空间利用率。若依赖相同静态库,则存在多份拷贝。
可执行文件大小。静态库文件较大。
c、动态库可以实现进程之间的资源共享,因此也称为共享库。

2. 静态库的创建与使用

静态库本质就是一组 .o 组成的压缩文件,扩展名为 .a / .lib

代码如下:


ar -crv libXXX.a mmmm.o nnnn.o

XXX 是库名,mmmm.o nnnn.o 是要打包的目标文件。crv 参数,含义分别是

c: do not warn if the library had to be created
r: replace existing or insert new file(s) into the archive
v: be verbose

使用时,只需在代码中引入 头文件,链接时,指定静态库的搜索路径(-L选项)和静态库名(不需要lib前缀和.a后缀,-l选项)。

代码如下:


g++ test.cpp -L../StaticLibrary -lXXX

3. 动态库

Window与Linux执行文件格式不同,在创建动态库的时候有一些差异。

Windows 下执行文件是 PE 格式,动态库需要一个DllMain函数做出初始化的入口,通常在导出函数的声明时需要有_declspec(dllexport)关键字。
Linux下 gcc 编译的执行文件默认是 ELF 格式,不需要初始化入口,亦不需要函数做特别的声明,编写比较方便。
linux 下动态库的命名格式同静态库,为 libXXX.so 格式。

动态库的创建,使用编译器即可,不需要像静态库一样使用专门的打包工具。

若要创建动态库,源码编译时添加 -fPIC 选项,链接时添加 -shared 选项。

代码如下:


g++ -fPIC -shared -o libXXX.so xxx.cpp

用法同静态库,

代码如下:


g++ test.cpp -L../DynamicLibrary -lXXX

只是需要设置下搜索路径。默认搜索路径:/lib/, /usr/lib。

设置搜索路径:

编辑 /etc/ld.so.conf,设置搜索路径
运行 ldconfig ,重建 /etc/ld.so.cache 文件。设置生效。
4. 相关工具
ldd 查看程序依赖的共享库(动态库)

代码如下:


gcc / g++ 参数 -I(大写 'i'),-L(大写'l'),-l(小写'L')

1、 -I(大写 'i') 头文件目录
2、-L(大写'l') 库目录
3、-l(小写'L') 库名
 
 大写是目录,小写是库。

到此,关于“linux静态库和动态库的创建与使用方法”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI