动态库、共享库、静态库

linux中的执行文件使用的一种叫做ELF格式来表示,这是一种特殊的二进制格式。ELF=Executable and Linkable Format, 可执行连接格式

Linux共享库的搜索路径先后顺序:
1、编译目标代码时指定的动态库搜索路径:在编译的时候指定-Wl,-rpath=路径
2、环境变量LD_LIBRARY_PATH指定的动态库搜索路径
3、配置文件/etc/ld.so.conf中指定的动态库搜索路径
4、默认的动态库搜索路径/lib
5、默认的动态库搜索路径 /usr/lib



gcc -c  a.c : 编译成目标文件

gcc -o  a.c : 生成可执行文件

gcc a.c :生成执行文件a.exe

总结:只要参数有-c,总是生成目标文件;只要参数中无-c而只有-o, 则总是生成执行文件。


通常库分为:静态库,共享库,动态加载库。

一、静态库—— 一些目标文件的集合。以.a结尾。

1. 使用场合:程序链接时使用。链接器会将程序中使用到得函数代码从库文件中拷贝到应用程序中。

2. 如何创建?举个例子:创建libhello静态库文件。

首先创建 libhello.c

1#include<stdio.h>
2void hello()
3{
4printf("hello, welcome to library world!\n");
5}

创建头文件 libhello.h

1void hello();

生成静态库 libhello.a

# gcc -c libhello.c -o libhello.o

# ar rcs libhello.a libhello.o  

/* PS:ar中的rcs的意思:r表明将模块加入静态库中,c表示创建静态库,s表示生产索引 */

使用静态库:

1#include<stdio.h>
2int main(void)
3{
4printf("use library hello.\n");
5hello();
6return0;
7}

#  gcc -c test.c -o test.o

#  gcc test.o -L. -lhello -o test

/* PS:-L.表示将当前目录加入到库搜索路径。默认的库搜索路径在/usr/lib目录下 */

/* PS:-I, 它表示搜索头文件的路径。这样gcc在查找头文件的时候会首先到-I指定的目录查找,然后才是系统默认目录 */

/* PS:-lname表示库搜索目录下的libname.a 或者libname.so文件 ,这也是为什么库文件都以lib开头的原因之一 */

/* PS:如果你的库文件不是libhello,而是hello. 那就不能用-l参数编译了, #  gcc test.o -L. hello.a -o test  */

/* PS:# gcc -L. -lhello test.o -o test   出错!!!-l是链接器选项,必须要放到被编译文件的后面  */


二、共享库:——  (以.SO结尾)在程序链接时做一些标记。在程序运行的时候,动态的加载所需模块。

因此,应用程序在运行的时候仍然需要共享库的支持。 共享库链接出来的文件比静态库要小得多。

一般,共享库有三个名字:linkr-name、soname、 real-name.



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值