本篇博客主要是介绍 动态库 与 静态库 的 生成 与 使用 :
一、生成可执行程序的链接方式
动态链接:链接动态库,只是在生成的程序中记录库中的函数信息表,并将具体代码实现写入到程序中,因此运行动态链接生成的程序时候需要依赖动态库的存在。 好处是内存中共享一份,无代码冗余!!!!!!!!!!!!!!
静态链接:链接静态库,在生成的程序中直接将库中所需函数的实现写入可执行程序中,生成的程序比较大,但没有依赖性!!!!!!!!!!!
二、库的生成
注:库中的函数中不能有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)里。