设为首页 加入收藏

TOP

Linux动态库生成与使用指南
2015-04-07 15:30:10 来源: 作者: 【 】 浏览:45
Tags:Linux 动态 生成 使用指南

Linux下动态库文件的文件名形如 libxxx.so,其中so是 Shared Object 的缩写,即可以共享的目标文件。


在链接动态库生成可执行文件时,并不会把动态库的代码复制到执行文件中,而是在执行文件中记录对动态库的引用。


程序执行时,再去加载动态库文件。如果动态库已经加载,则不必重复加载,从而能节省内存空间。


Linux下生成和使用动态库的步骤如下:


下面通过实例详细讲解。


建立一个源文件: max.c,代码如下:


编译生成共享库:


我们会得到libmax.so。


实际上上述过程分为编译和链接两步, -fPIC是编译选项,PIC是 Position Independent Code 的缩写,表示要生成位置无关的代码,这是动态库需要的特性; -shared是链接选项,告诉gcc生成动态库而不是可执行文件。


上述的一行命令等同于:


为了让用户知道我们的动态库中有哪些接口可用,我们需要编写对应的头文件。


建立 max.h ,输入以下代码:


建立一个使用max函数的test.c,代码如下:


gcc test.c -L. -lmax 生成a.out,其中-lmax表示要链接libmax.so
-L.表示搜索要链接的库文件时包含当前路径。


注意,如果同一目录下同时存在同名的动态库和静态库,比如 libmax.solibmax.a 都在当前路径下,
则gcc会优先链接动态库。


运行 ./a.out 会得到以下的错误提示。


找不到libmax.so,原来Linux是通过 /etc/ld.so.cache 文件搜寻要链接的动态库的。
/etc/ld.so.cache 是 ldconfig 程序读取 /etc/ld.so.conf 文件生成的。
(注意, /etc/ld.so.conf 中并不必包含 /lib/usr/libldconfig程序会自动搜索这两个目录)


如果我们把 libmax.so 所在的路径添加到 /etc/ld.so.conf 中,再以root权限运行 ldconfig 程序,更新 /etc/ld.so.cachea.out运行时,就可以找到 libmax.so


但作为一个简单的测试例子,让我们改动系统的东西,似乎不太合适。
还有另一种简单的方法,就是为a.out指定 LD_LIBRARY_PATH


程序就能正常运行了。LD_LIBRARY_PATH=. 是告诉 a.out,先在当前路径寻找链接的动态库。


编写makefile,内容如下:


make build就会生成libmax.somake test就会生成a.out并执行,make clean会清理编译和测试结果。


2015-03-11 Wed


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇C# 跨程序集调用常量、变量和函数 下一篇Java类的加载顺序

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: