关于动态库和静态库,这里很少解释,如何建立属于本身的动态库和静态库,以前有提过,详细内容戳连接。
mysql
静态库是一种以空间换取时间和移植性的作法,一些状况下确实有着必定的意义,可是一些状况下,咱们本身编写的简单项目,在绝大多数的机器上不存在移植性问题,是没有必要采用静态编译的。并且,在一些大型项目中,咱们很难避免去使用到开源库,举个例子,若是咱们只是单纯引用了mysql数据库的几个接口,有必要将整个mysql源文件所有编译吗?代价未免太大。一般的作法,是将mysql的include
sql
和lib目录打包以后,一块儿进行发布,来加强可移植性,也就是今天这里说的动态编译。shell
可是,动态编译默认状况下,只会去系统默认指定的目录下进行查找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
解决这个问题,网上给出的方法挺多,这里不会所有列出,给出最经常使用的方法:
ide
一、环境变量。使用export导入环境变量LD_LIBRARY_PATH,指明搜索路径。这个环境变量是临时指定动态库的搜索路径,是绑定终端的,至于什么缘由,了解过Linux的同窗应该知道,这里很少解释,为了说明问题,这里截图给出,具体用法以下:工具
再次说明,这种作法只是临时生效,在测试的时候为了方即可以使用,可是真正的项目发布,通常不会使用这种作法,由于须要在客户机器上建立环境变量以后才能够运行,我尝试了多种作法,想把命令放到脚本当中自动化去执行,但限于我的能力,还没有跨越子shell这一关。测试
二、第二种作法就显得更加有效。在/etc/ld.so.conf文件中,指明了动态库的搜索路径,通常请款下,文件内容为ui
include ld.so.conf.d/*.conf
代表,/etc/ld.so.conf.d目录下的所有*.conf文件中保存的都是动态库的搜索路径。这么说可能不太好理解,进入目录,随意打开一个文件,你就会明白,每一个文件中只有一条或几条路径,以下:spa
[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对动态库搜索路径的封装作的真心不错。blog
固然更改其余*.conf文件或建立本身的动态库链接目录配置文件后,须要使用ldconfig命令使之生效。
[root@bogon ld.so.conf.d]# ldconfig
三、其余的作法就是一些很非主流的作法了,将你所须要的动态库文件直接放入系统默认路径,坦白讲,这样作法没有问题,可是这是在给本身埋地雷,早晚有一天会出大问题。
四、另外还有一种比较生僻的作法,可是开源工程中会用到。使用gcc的选项确实能够实现,-Wl -rpath指定路径,我的来讲,不多使用这种作法,gcc/g++是一款很强大的编译工具,提供了上百个选项,有一大部分可能一生用不到,用到去查就能够了,没有必要太过深究。
-----muhuizz整理