Linux下如何解决动态库的链接问题

关于动态库和静态库,这里不多解释,如何创建属于自己的动态库和静态库,之前有提过,详细内容戳链接

静态库是一种以空间换取时间和移植性的做法,一些情况下确实有着一定的意义,但是一些情况下,我们自己编写的简单项目,在绝大多数的机器上不存在移植性问题,是没有必要采用静态编译的。而且,在一些大型项目中,我们很难避免去使用到开源库,举个例子,如果我们只是单纯引用了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文件中保存的都是动态库的搜索路径。这么说可能不太好理解,进入目录,随意打开一个文件,你就会明白,每个文件中只有一条或几条路径,如下:

[[email protected] ld.so.conf.d]# cat qt-i386.conf /usr/lib/qt-3.3/lib[[email protected] ld.so.conf.d]# cat mysql-i386.conf /usr/lib/mysql

每一个工具的动态库,都有着自己的动态库路径,因此,我们可以在该目录下创建自己的*.conf文件,文件中保存自己指定的动态库路径即可,个人绝对,Linux对动态库搜索路径的封装做的真心不错。

当然更改其他*.conf文件或创建自己的动态库连接目录配置文件后,需要使用ldconfig命令使之生效。

[[email protected] ld.so.conf.d]# ldconfig 

3、其他的做法就是一些很非主流的做法了,将你所需要的动态库文件直接放入系统默认路径,坦白讲,这样做法没有问题,但是这是在给自己埋地雷,迟早有一天会出大问题。

4、另外还有一种比较生僻的做法,但是开源工程中会用到。使用gcc的选项确实可以实现,-Wl -rpath指定路径,个人来说,很少使用这种做法,gcc/g++是一款很强大的编译工具,提供了上百个选项,有一大部分可能一辈子用不到,用到去查就可以了,没有必要太过深究。

-----muhuizz整理

时间: 2024-10-12 23:11:44

Linux下如何解决动态库的链接问题的相关文章

libpomelo2在linux下编译android动态库libjpomelo

参考文章如下: http://nodejs.netease.com/topic/540702e0898634292cd0a588 https://github.com/NetEase/libpomelo2 编译libjpomelo.so耗费了2天多的时间,资料很少,期间走了很多弯路,这里记录下. 1.官网下载libpomelo2源代码. 2.准备android ndk 10的包,我ubuntu是32位的,所以下载的是android-ndk32-r10b-linux-x86.tar.bz2    

linux下的静态连接库和动态链接库

对linux的静态连接库和动态链接库分不清楚,在看了一篇博文后,现在想做个自己的总结,以加深印象: 1.库的基本概念: 库是可执行代码的二进制形式,其可以被调入操作系统调入内存进行执行. 在window和linux系统,都存在各自的库,但是两种系统的库并不能兼容,因为它们的编译器,连接器,汇编器都是不相同的. 在windows下,静态连接库的后缀是.lib;动态链接库的后缀是.dll 在linux系统下,静态链接库的后缀是.a;动态链接库的后缀是.so 2.静态连接库和动态链接库的命名: 静态连

linux下编译安装boost库

转载:http://www.cnblogs.com/oloroso/p/4632848.html linux下编译安装boost库 linux下编译安装boost库 1.下载并解压boost 1.58 源代码 下载 解压 2.运行bootstrap.sh 3.使用b2进行构建 构建成功的提示 4.安装boost库到指定目录 5.测试一下 代码 编译运行 先看一下系统环境 Linux o-pc 3.19.0-22-generic #22-Ubuntu SMP Tue Jun 16 17:15:15

Linux下关于解决JavaSwing中文乱码的情况

1.下载simsun.ttc(宋体).http://download.csdn.net/detail/lazy_p/4436971 2.linux中跳转到JDK安装目录 ..../jre/lib/fonts 3.sudo mkdir fallback  然后将Windows所拷贝的字体放到fallback中 相关解决网址 http://www.linuxidc.com/Linux/2009-10/21991.htm http://www.cnblogs.com/zhangyongli2011/a

转载: linux下创建svn代码库

linux下创建svn代码库 1.安装svn客户端 2.创建svn代码库 1.安装svn客户端 1.1.使用命令安装 1)CentOS $ yum install subversion 2)ubuntu sudo apt-get install subversion 1.2.源码安装 http://www.cnblogs.com/fengbohello/p/4142810.html 2.开启svn服务进程 2.1.我的习惯是把代码仓库放在/opt/svn目录下,所以先创建目录/opt/svn $

linux应用开发-设计动态库

linux应用开发-设计动态库 一 制作动态库 1. gcc –c mylib.c –o mylib.o 2. gcc -shared -fPIC mylib.o -o libmylib.so  3. 将制作好的libmylib.so 复制到/usr/lib 4 -fpic 使输出的对象模块是按照可重定位地址方式生成 5 -shared 指明产生动态链接库. 二 基本概念见上一章设计静态库

Golang调用windows下的dll动态库中的函数

Golang调用windows下的dll动态库中的函数 https://blog.csdn.net/xuduorui/article/details/78943331 原文地址:https://www.cnblogs.com/yuanjiangw/p/12196004.html

Linux GCC编译使用动态、静态链接库 (转)

原文出处:http://blog.csdn.net/a600423444/article/details/7206015 在windows下动态链接库是以.dll后缀的文件,二在Linux中,是以.so作后缀的文件. 动态链接库的好处就是节省内存空间. 1.Linux下创建动态链接库 在使用GCC编译程序时,只需加上-shared选项即可,这样生成的执行程序即为动态链接库. 例如有文件:hello.c x.h main.c [plain] view plaincopy 编译:gcc hello.

Ubuntu linux设置从当前目录下加载动态库so文件

linux的excutable在执行的时候缺省是先搜索/lib和/usr/lib这两个目录,然后按照ld.so.conf里面的配置搜索绝对路径,linux缺省是不会在当前目录搜索动态库的.windows加载动态库的时候,缺省是首先加载本地目录下的动态库,然后再搜索windows/system和windows/system32目录. windows的动态库搜索顺序,虽然有可能会造成潜在的混乱,但是对于开发和测试无疑是比较方便的,尤其是debug和release版本的动态库需要经常切换进行测试的时候