Linux系统编程(十一)--- 动态库、静态库
一、静态库与动态库的基本概念
动态库(共享库):文件名为
libxxx.so
编译和运行时都需要库文件存在。程序运行时,动态库被动态加载,多个程序可以共享内存中的同一份动态库代码,节省内存和磁盘空间。静态库:文件名为
libxxx.a
编译时需要库文件存在,链接器会将库中用到的代码复制到最终的可执行文件中。运行时不再需要静态库文件,可执行文件是独立的。
必须写libxxx.so(xxx是你想定义的名字)
二、生成静态库的命令
gcc -c fun.c -o fun.o ar -rcv libfun.a fun.o第一步用
gcc -c编译出目标文件fun.o(不链接)。第二步用
ar工具将fun.o(有很多的.o就在后面加上)打包成静态库libfun.a。-r表示插入/替换,-c表示不显示创建信息,-v表示详细输出。
这是生成静态库的标准做法。
三、生成动态库的命令
gcc -fPIC -shared fun.c -o libfun.so-fPIC:生成位置无关代码(Position Independent Code),这是动态库所必需的,这样代码可以被加载到内存的任何位置。-shared:生成共享库(即动态库)。-o libfun.so:指定输出的动态库文件名。
(有很多的.c就在后面加上)
四、编译时链接库的方式
gcc main.c -lfun # 库文件必须存在于系统PATH下 gcc main.c -lfun -L ./ # 库文件存在于-L指定的路径下这里需要澄清两点:
库文件搜索路径与
PATH无关-lfun会让编译器在标准系统库目录(如/usr/lib、/lib)以及由-L指定的目录中查找libfun.so或libfun.a。
这里的“系统PATH下”属于表述不准确,应该是“系统库默认路径下”。链接时的查找顺序
如果同时存在静态库和动态库,默认优先链接动态库(除非使用
-static强制静态)。使用
-L ./可以让编译器在当前目录下搜索库文件。
假如你的动态库是libxxx则命令为:gcc main.c -lxxx
注意:程序运行时:目标平台的系统PATH下必须存在libxxx.so
