详解Linux动态库⽣成与使⽤指南
Linux下动态库⽂件的⽂件名形如 libxxx.so,其中so是 Shared Object 的缩写,即可以共享的⽬标⽂件。
在链接动态库⽣成可执⾏⽂件时,并不会把动态库的代码复制到执⾏⽂件中,⽽是在执⾏⽂件中记录对动态库的引⽤。
程序执⾏时,再去加载动态库⽂件。如果动态库已经加载,则不必重复加载,从⽽能节省内存空间。
Linux下⽣成和使⽤动态库的步骤如下:
编写源⽂件。
将⼀个或⼏个源⽂件编译链接,⽣成共享库。
通过 -L<path> -lxxx 的gcc选项链接⽣成的libxxx.so。
把libxxx.so放⼊链接库的标准路径,或指定 LD_LIBRARY_PATH,才能运⾏链接了libxxx.so的程序。
下⾯通过实例详细讲解。
编写源⽂件
建⽴⼀个源⽂件: max.c,代码如下:
int max(int n1, int n2, int n3)
{
int max_num = n1;
max_num = max_num < n2? n2: max_num;
max_num = max_num < n3? n3: max_num;
return max_num;
}
编译⽣成共享库:
gcc -fPIC -shared -o libmax.so max.c
我们会得到libmax.so。
实际上上述过程分为编译和链接两步, -fPIC是编译选项,PIC是 Position Independent Code 的缩写,表⽰要⽣成位置⽆关的代码,这是动态库需要的特性; -shared是链接选项,告诉gcc⽣成动态库⽽不是可执⾏⽂件。
上述的⼀⾏命令等同于:
gcc -c -fPIC max.c
gcc -shared -o libmax.so max.o
为动态库编写接⼝⽂件
为了让⽤户知道我们的动态库中有哪些接⼝可⽤,我们需要编写对应的头⽂件。
建⽴ max.h ,输⼊以下代码:
#ifndef __MAX_H__
#define __MAX_H__
int max(int n1, int n2, int n3);
#endif
测试,链接动态库⽣成可执⾏⽂件
建⽴⼀个使⽤max函数的test.c,代码如下:
#include <stdio.h>
#include "max.h"
int main(int argc, char *argv[])
{
int a = 10, b = -2, c = 100;
printf("max among 10, -2 and 100 is %d.\n", max(a, b, c));
return 0;
}
gcc test.c -L. -lmax ⽣成a.out,其中-lmax表⽰要链接libmax.so。
-L.表⽰搜索要链接的库⽂件时包含当前路径。
注意,如果同⼀⽬录下同时存在同名的动态库和静态库,⽐如 libmax.so 和 libmax.a 都在当前路径下,
则gcc会优先链接动态库。
运⾏
运⾏ ./a.out 会得到以下的错误提⽰。
./a.out: error while loading shared libraries: libmax.so: cannot open shared object file: No such file or directory
不到libmax.so,原来Linux是通过 /etc/ld.so.cache ⽂件搜寻要链接的动态库的。
⽽ /etc/ld.so.cache 是 ldconfig 程序读取 /etc/f ⽂件⽣成的。
(注意, /etc/f 中并不必包含 /lib 和 /usr/lib,ldconfig程序会⾃动搜索这两个⽬录)
如果我们把 libmax.so 所在的路径添加到 /etc/f 中,再以root权限运⾏ ldconfig 程序,更新 /etc/ld.so.cache ,a.out运⾏时,就可以到 libmax.so。
但作为⼀个简单的测试例⼦,让我们改动系统的东西,似乎不太合适。
还有另⼀种简单的⽅法,就是为a.out指定 LD_LIBRARY_PATH。
LD_LIBRARY_PATH=. ./a.out
程序就能正常运⾏了。LD_LIBRARY_PATH=. 是告诉 a.out,先在当前路径寻链接的动态库。
对于elf格式的可执⾏程序,是由ld-linux.so*来完成的,它先后搜索elf⽂件的 DT_RPATH 段, 环境变量 LD_LIBRARY_PATH, /etc/ld.so.cache⽂件列表, /lib/,/usr/lib⽬录, 到库⽂件后将其载⼊内存.
makefile让⼯作⾃动化
编写makefile,内容如下:
.PHONY: build test clean
build: libmax.so
libmax.so: max.o
gcc -o $@ -shared $<
max.o: max.c
gcc -c -fPIC $<
makefile phonytest: a.out
a.out: test.c libmax.so
gcc test.c -L. -lmax
LD_LIBRARY_PATH=. ./a.out
clean:
rm -f *.o *.so a.out
make build就会⽣成libmax.so, make test就会⽣成a.out并执⾏,make clean会清理编译和测试结果。
到此这篇关于详解Linux动态库⽣成与使⽤指南的⽂章就介绍到这了,更多相关Linux动态库⽣成内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。