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的小