linux的excutable在执行的时候缺省是先搜索/lib和/usr/lib这两个目录,然后按照ld.so.conf里面的配置搜索绝对路径,
linux缺省是不会在当前目录搜索动态库的
。windows加载动态库的时候,缺省是首先加载本地目录下的动态库,然后再搜索windows/system和windows/system32目录。
windows的动态库搜索顺序,虽然有可能会造成潜在的混乱,但是对于开发和测试无疑是比较方便的,尤其是debug和release版本的动态库需要经常切换进行测试的时候。
linux的动态库搜索顺序虽然可以说成是比较严谨,但是相对来说也比较呆板,有时候会造成不便。
其实,linux也可以支持“加载当前目录的动态库”。只要设置合适的环境变量LD_LIBRARY_PATH就可以了。设置方法有以下三种:
1、临时修改,只在 当前terminal有效
在terminal中执行:export LD_LIBRARY_PATH=./
注意:这里不一定有效,怎么办,指定全路径 export LD_LIBRARY_PATH=/home/xxx/xxx/xxx
2、让当前帐号以后都优先加载当前目录的动态库
修改~/.bash_profile在文件末尾加上两行: LD_LIBRARY_PATH=./ 和 export LD_LIBRARY_PATH
注意:这里不一定有效,怎么办,指定全路径 export LD_LIBRARY_PATH=/home/xxx/xxx/xxx
3、让所有帐号从此都优先加载当前目录的动态库
修改/etc/profile在文件末尾加上两行: LD_LIBRARY_PATH=./ 和 export LD_LIBRARY_PATH
注意:这里不一定有效,怎么办,指定全路径 export LD_LIBRARY_PATH=/home/xxx/xxx/xxx
PS:修改ld.so.conf不能达到我们的目的,因为ld.so.conf只支持绝对路径。
注意:这里不一定有效,怎么办,指定全路径 export LD_LIBRARY_PATH=/home/xxx/xxx/xxx
如果还是加载不了,请查看相关so 属性,
sudo chmod 777 -R /*
如果还是加载不了,再次查看相关so依赖
linux下查看动态链接库依赖关系的命令
x86:
ldd *.so
arm:
arm-linux-readelf -d *.so
这里我们只讲
Linux
环境下的静态库与
动态库
的生成与使用, Windows直接用VS直接就能生成。
在项目中使用库一般有两个目的,一个是为了使程序更加简洁不需要在项目中维护太多的源文件,另一方面是为了源代码保密,毕竟不是所有人都想把自己编写的程序开源出来。
当我们拿到了库文件(
动态库
、静态库)之后要想使用还
linux
的excutable在执行的时候缺省是先搜索/lib和/usr/lib这两个目录,然后按照ld.so.conf里面的配置搜索绝对路径,
linux
缺省是不会在
当前目录
搜索
动态库
的。windows
加载
动态库
的时候,缺省是首先
加载
本地目录下的
动态库
,然后再搜索windows/system和windows/system32目录。windows的
动态库
搜索顺序,虽然有可能会造成潜在的混乱,但是对于
linux
指定
动态库
路径包括:1.指定编译时
动态库
路径;2.指定运行时
动态库
路径。后文提到的
动态库
路径都是指的是这两种路径。众所周知,
Linux
动态库
的默认搜索路径是/lib和/usr/lib(不管是编译还是运行都会默认搜索这两个路径)。
动态库
被创建后,一般都复制到这两个目录中。当程序执行时需要某
动态库
,并且该
动态库
还未
加载
到内存中,则系统会自动到这两个默认搜索路径中去查找相应的
动态库
文件,然后加
<br />一、库文件的搜索路径:<br />1、在配置文件/etc/ld.so.conf中指定
动态库
搜索路径(需要添加其它库文件的路径,在文件的最后添加具体的路径即可 [ 如:/usr/local/lib ],添加后保存退出,然后在命令行ldconfig<br />2、通过环境变量LD_LIBRARY_PATH指定
动态库
搜索路径(当通过该环境变量指定多个
动态库
搜索路径时,路径之间用冒号":"分隔) <br />3、在编译目标代码时指定该程序的
动态库
搜索路径(还可以在编译目标代码时指定程序的
动态库
搜索路径。
1.1.1
linux
编写so文件的方式1首先gcc编译的时候要加-fPIC选项,-fPIC是告诉gcc生成一个与位置无关的代码2gcc链接的时候要加-shared选项,意思是生成一个so共享库。对于
linux
或者unix,一个so文件,文件扩展名必须是so,文件名的前三个字母必须是lib1.1.2
linux
使用sogcc链接的时候需要加-L.代表从
当前目录
下找相关的so文件,-l文件名(但不包括文...
1.为什么编译通过却无法运行?
默认情况下,gcc编译时只会查找相应的头文件,而不会连接具体的lib。也就是说只要include设置完全,就可以编译通过。它没有进一步检查include中的类和函数有没有实现,而是在运行时才开始查找。
所以就会经常发生编译可以通过,但运行时却无法运行,因为在运行时它找不到相关类或者函数的实现。
2.解决方法
用过microsoft的vc6或者vs的小