linux下使用gcc生成静态库和动态库及其使用

本文将将介绍如何在linux下使用gcc生成静态库和动态库,以及如何使用库。


一、简单说明


库是二进制可执行代码,可以被操作系统载入内存执行。linux下的库有2种:静态库和动态库,它们的区别在于代码被载入的时刻不同,静态库的代码在编译过程中已经被载入可执行程序,因此最终生成的可执行文件比较大,在运行时比较占内存,不过相对快些;动态库的代码是在可执行程序运行时才载入内存的,因此最终生成的可执行文件比较小,程序运行时,不同的程序可以使用同一动态库的同一副本,节约内存,不过相对慢些。

下面我通过一个例子说明静态库动态库的生成和使用。有hello.h,hello.c,main.c三个文件,其中hello.h中为函数库的头文件,hello.c为函数库的源程序,main.c中使用库中的函数。函数如下图所示:


二、库的生成及使用


要生成库,首先要知道,静态库和动态库均是由目标文件(.o文件)创建的。其中,静态库的名字一般为lib*.a,动态库的名字一般为lib*.so。
首先使用gcc -c hello.c -o hello.o命令对hello.c进行编译,生成hello.o文件。


1、静态库


使用命令ar rcs libhello.a hello.o创建静态库文件libhello.a。
使用静态库,只要在程序中包含静态库头文件,如我的main.c包含hello.h头文件,再在使用gcc命令生成可执行文件时指明静态库名,gcc将会从静态库中将所用函数连接到可执行文件中,由于gcc会在静态库名前加上前缀lib,然后追加扩展名.a得到静态库文件名来查找静态库文件,所以在gcc命令中只写名字即可(动态库类似),如lhello;
使用命令gcc main.c -o hello -static -L. -lhello使用库(下图中截图没截好,-lh应为-lhello),生成可执行文件,其中-L.表示使用的库位于当前目录,lhello指明使用的库名。
具体操作如下图所示:


2、动态库


使用命令gcc -shared -fPIC -o libhello.so hello.o来创建动态库libhello.so,其中fPIC用于告诉gcc产生的代码不要包含对函数和变量具体内存位置的引用(动态库运行时链接)。
使用动态库和静态库类似,只要在程序中包含动态库头文件,如我的main.c包含hello.h头文件,再在使用gcc命令生成可执行文件时指明动态库名;
使用命令gcc main.c -o hello -L. -lhello使用库,生成可执行文件hello,执行hello会报错:找不到动态库文件libhello.so,这个错误可以通过2种简单的方法解决:
  • 将libhello.so复制到目录/usr/lib中(cp libhello.so /usr/lib)
  • 将当前目录添加到环境变量LD_LIBRARY_PATH中(export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.)

说明:程序运行时,会在/usr/lib和/lib等目录中查找需要的动态库;

LD_LIBRARY_PATH:指定程序动态链接库文件搜索路径。

LIBRARY_PATH:指定程序静态链接库文件搜索路径。

具体操作如下图所示:


在文章结尾作2点说明:(自己试下吧)
ldd命令可查看一可执行程序依赖的动态库。
当静态库和动态库同名时,gcc将优先使用动态库。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值