栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

Linux 之 动态库与静态库 (1)

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Linux 之 动态库与静态库 (1)

本篇博客主要是介绍 动态库 与 静态库 的 生成 与 使用 :

一、生成可执行程序的链接方式

动态链接:链接动态库,只是在生成的程序中记录库中的函数信息表,并将具体代码实现写入到程序中,因此运行动态链接生成的程序时候需要依赖动态库的存在。 好处是内存中共享一份,无代码冗余!!!!!!!!!!!!!!

静态链接:链接静态库,在生成的程序中直接将库中所需函数的实现写入可执行程序中,生成的程序比较大,但没有依赖性!!!!!!!!!!!

二、库的生成

注:库中的函数中不能有main函数,否则会造成冲突

1、将原码经过编译汇编之后,解释为二进制指令

gcc -fPIC -c testlib.c -o testlib.o 

其中,testlib.o 为二进制代码,需要添加 -fPIC ,如下面的例子!!!!

2、将编译完成后的二进制指令组织打包成为可执行或者库文件
动态库是 .so 文件,静态库是 .a 文件
1)动态库生成:

gcc --shared testlib.o ... -o libtestlib.so 

生成共享对象,动态库只有在运行时才会加载到虚拟地址空间中
libtestlib.so :该库的名称为 testlib, lib 与 .so 是命名格式

2)静态库生成:

ar -cr libtestlib.a testlib.o ...

上述代码中 ... 代表的是其他 .o 文件
libtestlib.a :该库的名称为 testlib, lib 与 .a 是命名格式

如:

gcc -fPIC -c testlib.c -o testlib.o 

其中,无 -fPIC 时,会产生未知无关代码,必须是绝对偏移量,不能有相对偏移量,否则会造成程序混乱,即必须有-fPIC ,是生成共享文件的必备指令

gcc --shared testlib.o -o libtestlib.so
三、库的使用

gcc 默认是动态链接,其链接的会是动态库

使用 -l 选项指定要链接的库名称,使用库的代码:

gcc main.c -o mymain -ltestlib

注:上述程序中 -l 后需紧跟库的名称,且该库必须放在默认路径下,必须能让链接器找到该库。
链接器在链接库文件生成可执行程序的时候,会到指定的一些路径下去找库文件,找到了就进行链接,找不到则报错!!

生成可执行程序时链接库文件的方法:
下面三种方法都可实现在生成可执行程序时链接库文件!三选一

1、库文件放在指定路径下:

作者的 Linux 中对应的指定路径为:

/usr/lib64 

而将库文件放置指定路径下的代码为:

sudo cp ./libtestlib.so /usr/lib64/

2、设置环境变量:

export LIBRARY_PATH=$LIBRARY_PATH:./  

将当前路径添加到 LIBRARY_PATH 中,如此不需要进行上述第一步操作

:可用 echo $LIBRARY_PATH,对 LIBRARY_PATH 中内容进行查看

3、使用 gcc 的 -L :

gcc main.c -o mymain -L./ -ltestlib  

用 -L 指定库路径,其他和上述一致,若想运行不出错,还需将库文件放在指定路径下。
若想运行,还需执行该行程序:

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:./

网上还有其他方法,后续有机会继续罗列!

注:因为本篇博客内容较多,所以相关案例放在了博客 Linux 之 动态库与静态库 (2)里。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/320389.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号