-
系统app使用动态库加载失败
2016-07-07 10:00:37系统app使用动态库时,打包进apk中的动态库无法加载,加载失败,运行时报错本地方法找不到,动态库加载失败。加载的时候会到/system/lib与/vendor/lib下去找动态库去加载,所以需要将动态库放入这两个文件夹下,静态...系统app使用动态库时,打包进apk中的动态库无法加载,加载失败,运行时报错本地方法找不到,动态库加载失败。加载的时候会到/system/lib与/vendor/lib下去找动态库去加载,所以需要将动态库放入这两个文件夹下,静态库未测,应该也差不多吧,不对请指正。
-
1.7-1.8动态库加载失败的原因和解决办法
2021-01-30 11:39:531.动态库和静态库的原理 GCC进行链接时,会把静态库中的...2.动态库加载失败的原因 下面通过ldd命令查看main的动态库依赖关系: 可以看到列出了用到的4个动态库。 上面提到的动态载入器eld-linux.so即最后一...目录
3.2将libcalc.so的路径加入到环境变量LD_LIBRARY_PATH中
3.3将libcalc.so的路径加入到/etc/ld.so.cache文件列表中
3.4将libcalc.so直接放到/lib/、/usr/lib目录中
1.动态库和静态库的原理
GCC进行链接时,会把静态库中的代码放到可执行程序中。但是对于动态库,不会把代码放到可执行程序中,只会把一些相关信息(如动态库的名字等)放到可执行程序中。运行的时候,如果用到了动态库中的内容,在可执行程序中是找不到的。导致错误出现。
注:执行时如果用到了动态库中的API,动态库会被加载到内存中。
2.动态库加载失败的原因
下面通过ldd命令查看main的动态库依赖关系:
可以看到列出了用到的4个动态库。
上面提到的动态载入器eld-linux.so即最后一个动态库。
因为动态载入器在DT_RPATH段、环境变量LD_LIBRARY_PATH等中找不到libcalc.so的绝对路径,所以会报错。
3.解决方法
将libcalc.so的路径加入到DT_RPATH段、LD_LIBRARY_PATH、/etc/ld.so.cache文件列表或者将libcalc.so直接放到/lib/、/usr/lib目录中
3.1 DT_RPATH段
DT_RPATH段我们改变不了,直接下一个。
3.2将libcalc.so的路径加入到环境变量LD_LIBRARY_PATH中
方式1:在终端直接加 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/wcj/projec/lesson4/library/lib
即先获取原来的环境变量,再在后面加上动态库的路径
但是该终端关闭后,值之前加的环境变量就失效了,打开新终端之后又得重新弄。
下面讲永久配置,分为两种方式:用户级别的配置和系统级别的配置
方式2:永久配置---用户级别
打开.bashrc文件:
(vi中,shift+G可以跳到最后一行,小写的o可以向下插入一行)
在最后一行插入:
保存之后,使修改生效:
第一个点相当于source,也可以写成“source .bashrc”
回到原来的目录,发现可以运行:
方式3:永久配置--系统级别
配置之前,先把上面配置的删掉。并重新打开一个终端,防止上一步潜在的影响。
打开/etc/profile文件:
在最后一行添加:
使修改生效:
回到原来的目录中,可以执行,如下图:
3.3将libcalc.so的路径加入到/etc/ld.so.cache文件列表中
先将上面的修改删除,再重新打开一个终端
先尝试打开/etc/ld.so.cache:
发现不能编辑,如下图:
既然不能直接修改这个文件,那就间接修改:
添加动态库的路径:
保存之后,更新:
回到原来的目录,可以执行,如下图:
3.4将libcalc.so直接放到/lib/、/usr/lib目录中
最后一种不建议使用。因为这两个目录中保存的是系统的库文件,防止对其误操作。
参考:牛客网 C++高薪求职项目《Linux高并发服务器开发》1.7/1.8动态库加载失败的原因和解决
专属优惠链接:
https://www.nowcoder.com/courses/cover/live/504?coupon=AvTPnSG
-
Android安卓运行时so动态库加载失败问题解决办法
2020-04-15 11:22:35安卓App在启动或运行时经常会遇到.so动态库加载失败的情况,其中具体分2种情况: 1.在程序启动时加载失败,这时候就需要用Relinker去重新加载,可以看我的另外2篇博文:Relinker源码分析、Android安卓本地库加载程序...安卓App在启动或运行时经常会遇到.so动态库加载失败的情况,其中具体分2种情况:
1.在程序启动时加载失败,这时候就需要用
Relinker
去重新加载,可以看我的另外2篇博文:Relinker源码分析、Android安卓本地库加载程序Relinker简单封装2.在程序运行过程中,已经加载好的.so库被卸载,导致使用的时候找不到符号,这种情况下就要在运行过程中,需要用到库的时候重新去加载
第2种情况主要操作思路是:
- 1.尝试跑native方法
- 2.捕获异常,如果没有异常说明运行成功
- 3.如果有异常,那就重新加载.so动态库
- 4.加载完后重新运行native方法
来个例子🌰:
- 公共基类:
import android.content.Context; import com.getkeepsafe.relinker.ReLinker; public class NativeBaseClass { private static Context sContext = null; /** * 加载动态库方法 */ private static void loadLibrary() { if (sContext != null) { ReLinker.loadLibrary(sContext, "myLibrary"); } else { System.loadLibrary("myLibrary"); } } static { //在第一次访问这个类时,就会去加载动态库。这段代码只会运行一次 loadLibrary(); } /** * 尝试运行native方法,失败时会重新加载动态库 * @param runnable 里面包含需要运行的native方法 */ public static void tryRunNativeFunction(Runnable runnable) { try { runnable.run(); } catch (Throwable e) { loadLibrary(); runnable.run(); } } }
- 子类:实际功能方法
public class MyClass extends NativeBaseClass { public void func() { NativeBaseClass.tryRunNativeFunction(new Runnable() { @Override public void run() { nativeFunc(); } }); } private static native void nativeFunc(); }
-
动态库加载失败测试
2020-04-17 09:38:33编译的c动态库,在java调用时出现加载库失败的情况,如何定位问题点? 可以通过dlopen在c层测试是否能正确加载 参考链接:https://www.jianshu.com/p/72cc08405a5a 测试代码: #include <stdio.h> #include &...编译的c动态库,在java调用时出现加载库失败的情况,如何定位问题点?
可以通过dlopen在c层测试是否能正确加载
参考链接:https://www.jianshu.com/p/72cc08405a5a
测试代码:#include <stdio.h> #include <stdlib.h> #include <dlfcn.h> const char *dllPath = "./libXXX.so" int main() { void *handle = dlopen(dllPath,RTLD_LAZY); if(!handle) { fprintf( stderr, "[%s](%d) dlopen get error: %s\n", __FILE__, __LINE__, dlerror() ); exit( EXIT_FAILURE ); } printf("load libXXX success\n"); dlclose(handle); return 0; }
-
Linux动态库加载失败/设置运行时搜索路径/linux中查看动态库的查找搜寻路径
2017-01-21 17:10:07程序运行时有以下错误 ./dom1: error while loading shared libraries: libmemcached.so.11: cannot open shared object ...动态库加载失败 1、首先应该使用命令查看所加载的库 ldd ./dom1 linux-vdso.so.1 =... -
QT 动态库加载失败
2014-11-12 14:39:50手动封装DLL,然后通过Qlibrary 加载,老是提示 -
已解决:动态库加载失败:cannot open shared object file: No such file or directory
2021-02-02 23:23:43使用动态库编译链接main.c后,得到名为main的可执行程序。但是在运行main可执行程序时,程序报错: ./main: error while loading shared libraries: libcalc.so: cannot open shared object file: No such file or ... -
PHP启动:动态库加载失败...
2017-11-29 20:42:00今天在linux上面智障一般搞了好久,本来想安装个swoole的,然后用 php -m 的命令想看下安装的PHP扩展库,发现有的扩展库有的可以出来,有的加载失败, 加载失败的错误类型: ... -
mysql动态链接库初始化失败_Linux动态链接库加载失败一例
2021-02-02 06:13:02安装pacemakerrpm包后,遇到启动失败的情况,原因和动态链接库的加载有关,以下是详细。问题编译生成pacemaker 1.1.15的rpm包,然后在其它机器上安装pacemaker rpm包后,启动失败。[root@srdsdevapp73 ~]# service ... -
Linux动态链接库加载失败一例
2016-10-08 12:16:30安装pacemakerrpm包后,遇到启动失败的情况,原因和动态链接库的加载有关,以下是详细。 问题 编译生成pacemaker 1.1.15的rpm包,然后在其它机器上安装pacemaker rpm包后,启动失败。 [root@... -
LoadLibrary加载动态库失败
2019-10-04 04:45:11LoadLibrary加载动态库失败的可能原因以及解决方案: (1)dll动态库文件路径不对。此场景细分为以下几种情况: 1.1 文件路径的确错误。比如:本来欲加载的是A文件夹下的动态库a.dll,但是经过仔细排查原因,发现a... -
Unity调用c++动态库 unity加载失败的问题总结
2018-10-29 09:50:30网上一搜一大堆,我的问题是,由于我的动态库链接了zlib的动态库,可能是unity对zlib的加载有问题,如果出现加载不了的情况,及其有可能是c++动态库加载了其他不兼容的动态库,我在项目里面把依赖的动态库都改成了... -
msxml4.dll加载失败、动态链接库例程失败
2021-01-22 16:34:03用户使用我们行业软件,打开程序出现:msxml4.dll加载失败,程序退出! 故障系统: XP 解决方案: ①从互联网上下载msxml4.dll文件,放至对应目录,XP为:C:\Windows\System32 ②用cmd运行:regsvr32 msxml4.dll ... -
加载动态库失败
2012-11-26 17:24:31我用depends工具看了这个动态库的依赖库文件,在system32目录下都有,麻烦各位高手指点啊! 还有这个控件在使用IE6/IE8浏览器的时候安装了控件也没有用,是什么原因啊,我已经把浏览器安全等级设为中了,虚心求教... -
libevent-1.4.so.2动态链接库加载失败
2016-05-09 13:52:10问题描述: ./server: error while loading shared libraries: libevent-1.4.so.2: cannot open shared object file: No such file or directory 问题原因: ...LD_DEBUG=libs ./server -v > log 2>&1 ... -
Linux程序运行时加载动态库失败的解决方法
2020-09-15 00:53:49今天小编就为大家分享一篇关于Linux程序运行时加载动态库失败的解决方法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧