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)里。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值