参考文章:dll和so文件区别与构成:http://www.cnblogs.com/likwo/archive/2012/05/09/2492225.html

动态库路径配置- /etc/ld.so.conf文件:http://blog.csdn.net/blade2001/article/details/32839937

1.如何生成一个动态库:

假设有4个文件(1个头文件,3个.c源文件)so_test.h、test_a.c、test_b.c、test_c.c。我们将这几个文件编译成一个动态库:libtest.so。

so_test.h:
#include <stdio.h>
#include <stdlib.h>
void test_a();
void test_b();
void test_c();
test_a.c:
#include "so_test.h"
void test_a()
{
printf("this is in test_a...\n");
}
test_b.c:
#include "so_test.h"
void test_b()
{
printf("this is in test_b...\n");
}
test_c.c:
#include "so_test.h"
void test_c()
{
printf("this is in test_c...\n");
}
将这几个文件编译成一个动态库:libtest.so
$ gcc test_a.c test_b.c test_c.c -fPIC -shared -o libtest.so
2、动态库的链接
在1、中,我们已经成功生成了一个自己的动态链接库libtest.so,下面我们通过一个程序来调用这个库里的函数。程序的源文件为:test.c。
test.c:
#include "so_test.h"
int main()
{
test_a();
test_b();
test_c();
return 0;
}
l         将test.c与动态库libtest.so链接生成执行文件test:
$ gcc test.c -L. -ltest -o test
l         测试是否动态连接,如果列出libtest.so,那么应该是连接正常了
$ ldd test
l         执行test,可以看到它是如何调用动态库中的函数的。
但是此时出现以下问题:

$>ldd test
linux-gate.so.1 => (0xb77c6000)
libtest.so => not found//动态库未找到
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb75ea000)
/lib/ld-linux.so.2 (0xb77c7000)

但是查看当前目录下明明有动态库呀。

$>ls -l
总用量 36
-rwxrwxr-x 1 burgess burgess 6992 Dec 6 16:58 libtest.so
-rw-rw-r-- 1 burgess burgess 249 Dec 6 16:54 so_test.h
-rwxrwxr-x 1 burgess burgess 7372 Dec 6 17:00 test
-rw-rw-r-- 1 burgess burgess 189 Dec 6 16:55 test_a.c
-rw-rw-r-- 1 burgess burgess 189 Dec 6 16:56 test_b.c
-rw-rw-r-- 1 burgess burgess 209 Dec 6 17:00 test.c
-rw-rw-r-- 1 burgess burgess 189 Dec 6 16:57 test_c.c

执行./test却出错!

./test
./test: error while loading shared libraries: libtest.so: cannot open shared object file: No such file or directory

错误提示动态库里没有这个文件。

动态装入器负责装入动态链接的可执行程序运行所需的共享库(shared library,即动态库)。

ld.so.conf 文件包含一个所有目录(/lib 和 /usr/lib 除外,它们会自动包含在其中)的清单,动态装入器将在其中查找共享库。

那么此时我们就需要把这个文件的路径加入ld.so.conf 文件里了。

最省事的办法就是通过/etc/ld.so.conf文件来指定动态库的目录(需要有root权限)。

#vi  /etc/ld.so.conf

里面显示:

include /etc/ld.so.conf.d/*.conf
 /usr/local/lib

这里的“/usr/local”就是默认的动态库路径了。我们想要添加自己的路径再起一行加入就OK。j假设“libtest.so”所在路径是:“/home/burgess/gitlearn/test”

那么添加进去就变成了

include /etc/ld.so.conf.d/*.conf
 /usr/local/lib
/home/burgess/gitlearn/test

但是加进去了,退回到当前用户再去$>ldd test还是显示libtest.so => not found。

原来在动态装入器能“看到”这一信息之前,必须将它转换到 ld.so.cache 文件中。可以通过运行 ldconfig 命令做到这一点:

#ldconfig

另外,要查看 ldconfig 可以“看到”的所有共享库,输入:  

# ldconfig -p | less

就可以查看libtest.so是否在显示的库列表里了。

最后,再执行:

$>ldd test

显示动态库就找到了:

linux-gate.so.1 => (0xb77dc000)
libtest.so => /home/burgess/gitlearn/test/libtest.so (0xb77b8000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb75fd000)
/lib/ld-linux.so.2 (0xb77dd000)

(下面这段话是照第二篇文章搬过来的,大家别拿板砖砸我。)

还有另一个方便的技巧可以用来配置共享库路径。有时候希望告诉动态装入器在尝试任何 /etc/ld.so.conf 路径以前先尝试使用特定目录中的共享库。在运行的较旧的应用程序不能与当前安装的库版本一起工作的情况下,这会比较方便。

LD_LIBRARY_PATH

要指示动态装入器首先检查某个目录,请将 LD_LIBRARY_PATH 变量设置成您希望搜索的目录。多个路径之间用冒号分隔;例如:

# export LD_LIBRARY_PATH="/usr/lib/old:/home/burgess/gitlearn/test/lib"

导出 LD_LIBRARY_PATH 后,如有可能,所有从当前 shell 启动的可执行程序都将使用 /usr/lib/old 或 /opt/lib 中的库,如果仍不能满足一些共享库相关性要求,则转回到 /etc/ld.so.conf 中指定的库。

转载于:https://www.cnblogs.com/Burgess-Fan/p/6138687.html

Linux下创建动态库与使用相关推荐

  1. Linux下的动态库和静态库

    什么是库? 在 Linux 开发时,我们经常会看到一些形如 xxx.so 的名称出现,其中 so 是 Shared Object 的缩写,即可以共享的目标文件,也就是我们所称为的动态链接库,和在 Wi ...

  2. linux 下的动态库制作 以及在python 中如何调用 c 函数库

    linux 下的动态库制作 以及在python 中如何调用 c 函数库 动态库: 动态库又称动态链接库英文为DLL,是Dynamic Link Library 的缩写形式,DLL是一个包含可由多个程序 ...

  3. linux下设定动态库路径的命令-error while loading shared libraries: xxx.so.x错误的原因和解决办法

    网站:http://blog.chinaunix.net/uid-26212859-id-3256667.html 一般我们在Linux下执行某些外部程序的时候可能会提示找不到共享库的错误, 比如: ...

  4. Linux 下的动态库、静态库与环境变量

    最近这几天在处理集群软件的过程中,遇到各种各样的库和环境变量的问题,被虐的不清!趁此机会,整理了一下 Linux 下静态库.动态库(共享库)和环境变量的一些知识,与大家共享一下. 库的种类 Linux ...

  5. C++文件如何在linux下生成动态库So,以及如何使用这个动态库

    引用:http://blog.csdn.net/xuguang121/article/details/7457565 不同组件之间,如何提供一个动态库给其他Team使用,这样使用者也不需要关心和维护你 ...

  6. Windows下创建动态库

    工具:vs2010 条件: (1).需要一个DllMain函数做初始化的入口(创建win32控制台程序时,勾选DLL类型会自动生成这个文件) (2).需要在导出函数的声明处加_declspec(dll ...

  7. Linux下减小动态库大小的方法

    在一些业务场景下,需要对动态库的大小进行限制,主要有如下几种方法: 1. 编译选项使用-Os,表示以最小化大小为优化方向 2. 去除-g选项,进而去除调试信息 3. 通过strip裁剪符号及调试信息 ...

  8. linux查看动态库导出的符号,Linux下控制动态库导出

    在Linux中动态库的确给程序带来了良好的扩充性,并减少了内存的使用量,但这是有代价的.例如: #include Int main(int argc, char *argv[]) { Printf(& ...

  9. linux下制作动态库

    1.动态库的介绍 动态库,也叫共享库. 动态库与用户编写的程序相互独立,不被包含在用户生成的可执行文件当中 2.动态库的创建 第一步:将写好的程序编译 我们事先写好两个程序,bye.c hello.c ...

最新文章

  1. 对float浮动的我的理解,形象生动一点
  2. php member limit,PHPAPP注入第十枚(未过滤)
  3. 4.有关日期格式属性修改常识,v$nls_parameters,between and,查询指定部门的员工信息,in和null,like模糊查询,order by后面可以跟:列名、表达式、别名、序号
  4. nginx 压缩和缓存设置
  5. ejb运行程序_在哪里可以运行EJB?
  6. Shell编程:shell script 的追踪与 debug
  7. 儿童手表还能这么用?定位功能防出轨 网友:这令人窒息的爱情
  8. pythonlocust使用方法_python locust 性能测试:locust安装和一些参数介绍
  9. python (continue与break)区别
  10. nginx url 重写_Nginx重写URL规则示例
  11. java读取外部配置文件_SpringBoot读取外部配置文件的方法
  12. java mainclass_java – 无法加载Main-Class清单属性
  13. 【全文干货】python—函数详解(值得收藏的学习手册)
  14. 洛谷试炼场:单词接龙
  15. comsol入门闲聊
  16. 显著目标检测的研究思路
  17. myeclipse项目导入eclipse在Web项目下的WebRoot和WebContent
  18. 飞信怎么登陆总是显示服务器错误咋回事,手机飞信无法登陆怎么办 飞信无法登陆解决方法...
  19. iOS/Android 微信及浏览器中唤起本地APP
  20. 爬取猫眼电影评论及数据分析(三)之数据可视化

热门文章

  1. 第十章练习题----2
  2. [转][探讨]为什么说JavaScript是性价比最高的技术?
  3. LINUX环境搭建:安装中文定制版UBUNTU 10.10
  4. Symbol Mc1000 快捷键 的 设置 事件 开发
  5. ACM001 Quicksum
  6. iOS之UITraitCollection
  7. redis系列:分布式锁
  8. Qt第五课 无构造函数可以接受源类型,或构造函数重载决策不明确
  9. IBM将推NVMe存储解决方案
  10. spring --aop(日志记录)在工程中实际使用