Linux C : 静态链接库和动态链接库

gcc的编译过程分为三步:

第一步将  文件1.c  分别通过编译器解析成汇编语言  

第二步将   文件1.s  文件2.s   文件3.s 分别通过汇编器 生成obj目标代码文件

第三步将 这些文件通过链接器生成 out 的可执行文件 ,将多个目标代码文件合成一个文件

而在第三步中链接方式有两种,一种是静态链接,另一种是动态链接。例如 A文件引用了B文件 ,所谓静态链接,就是将A和B打包进同一个最终可执行文件中。而动态链接,函数库B无需打包进可执行文件中,当A也需要引用到B时,A通过读链接库目录,获取关联的库来实现。而链接库目录通常被设置为环境变量。链接库的好处就是移植性好,静态链接的优点就是执行程序时不需要考虑再链接问题了,因为静态链接库中的代码已经被合成进可执行文件中,这样的坏处就是使得可执行文件大小变得大,显得浪费空间。

在一个文件 mysum.c中写入如下代码

在主程序 helloword.c 写入如下代码 ,可以看出 主程序中引用到了 mysum.c 

一、静态链接

创建静态链接库:

gcc -c mysum.c  -o mysum.o   #把mysum.c 编译成目标文件 mysum.o
ar rcs libmysumlib.a mysum.o  # 利用mysum.o 等文件创建出静态链接库

静态链接:-L. 指定链接库为当前目录,  -l指定链接库

gcc -static helloworld.c -L. -l mysumlib -o helloworld.out   #helloworld.c 编译静态链接 libmylib.a

需要注意的是链接库并未指定前缀 lib和后缀.a

执行 

二、动态链接

创建动态链接库,并不需要ar等打包工具 

gcc -c -fPIC mysum.c #生成.o文件
gcc -shared -o libmylib.so mysum.o   #创建动态库

指定链接路径

gcc helloworld.c -L. -l mylib

必须设置  LD_LIBRARY_PATH 环境变量

export LD_LIBRARY_PATH=./    # 指定当前目录
./a.out 3 4                  # 执行程序

如果链接库不再当前目录中,需要更改 -L选项  和 环境变量  LD_LIBRARY_PATH 以指向包含的链接库目录。或者可以运行ldconfig 来配置动态链接库路径。

猜你喜欢

转载自blog.csdn.net/superSmart_Dong/article/details/116353462