标签:gcc 动态库 error while loading shared libraries
关于动态库和静态库,这里不多解释,如何创建属于自己的动态库和静态库,之前有提过,详细内容戳链接。
静态库是一种以空间换取时间和移植性的做法,一些情况下确实有着一定的意义,但是一些情况下,我们自己编写的简单项目,在绝大多数的机器上不存在移植性问题,是没有必要采用静态编译的。而且,在一些大型项目中,我们很难避免去使用到开源库,举个例子,如果我们只是单纯引用了mysql数据库的几个接口,有必要将整个mysql源文件全部编译吗?代价未免太大。通常的做法,是将mysql的include
和lib目录打包之后,一起进行发布,来增强可移植性,也就是今天这里说的动态编译。
但是,动态编译默认情况下,只会去系统默认指定的目录下进行查找lib***.so文件,甚至我们在Makefile中使用-L选项指明了LIB目录,编译不会出错,但在运行的时候,会出现下面这种报错:
./cgi_select: error while loading shared libraries: libmysqlclient.so.18:
cannot open shared object file: No such file or directory
解决这个问题,网上给出的方法挺多,这里不会全部列出,给出最常用的方法:
1、环境变量。使用export导入环境变量LD_LIBRARY_PATH,指明搜索路径。这个环境变量是临时指定动态库的搜索路径,是绑定终端的,至于什么原因,了解过Linux的同学应该知道,这里不多解释,为了说明问题,这里截图给出,具体用法如下:
再次说明,这种做法只是临时生效,在测试的时候为了方便可以使用,但是真正的项目发布,一般不会使用这种做法,因为需要在客户机器上创建环境变量之后才可以运行,我尝试了多种做法,想把命令放到脚本当中自动化去执行,但限于个人能力,尚未跨越子shell这一关。
2、第二种做法就显得更加有效。在/etc/ld.so.conf文件中,指明了动态库的搜索路径,一般请款下,文件内容为
include ld.so.conf.d/*.conf
表明,/etc/ld.so.conf.d目录下的所有*.conf文件中保存的都是动态库的搜索路径。这么说可能不太好理解,进入目录,随意打开一个文件,你就会明白,每个文件中只有一条或几条路径,如下:
[root@bogon ld.so.conf.d]# cat qt-i386.conf
/usr/lib/qt-3.3/lib
[root@bogon ld.so.conf.d]# cat mysql-i386.conf
/usr/lib/mysql
每一个工具的动态库,都有着自己的动态库路径,因此,我们可以在该目录下创建自己的*.conf文件,文件中保存自己指定的动态库路径即可,个人绝对,Linux对动态库搜索路径的封装做的真心不错。
当然更改其他*.conf文件或创建自己的动态库连接目录配置文件后,需要使用ldconfig命令使之生效。
[root@bogon ld.so.conf.d]# ldconfig
3、其他的做法就是一些很非主流的做法了,将你所需要的动态库文件直接放入系统默认路径,坦白讲,这样做法没有问题,但是这是在给自己埋地雷,迟早有一天会出大问题。
4、另外还有一种比较生僻的做法,但是开源工程中会用到。使用gcc的选项确实可以实现,-Wl -rpath指定路径,个人来说,很少使用这种做法,gcc/g++是一款很强大的编译工具,提供了上百个选项,有一大部分可能一辈子用不到,用到去查就可以了,没有必要太过深究。
-----muhuizz整理
本文出自 “暮回” 博客,请务必保留此出处http://muhuizz.blog.51cto.com/11321490/1927864
标签:gcc 动态库 error while loading shared libraries
原文地址:http://muhuizz.blog.51cto.com/11321490/1927864