一、dlopen file not found

1,动态库位置不对

解决办法:放到指定目录。

2,文件系统没有准备好,比如机器启动时,可能库还没有放到对应的位置,此时dlopen也会失败

解决方法:等文件系统准备好

if ( uname (&sysinfo) == EOK ) {
    if ( strstr ( sysinfo.machine , "RECOVERY")) {
            in_recovery = 1 ;
    }
}

3,编译链上没有添加-fPIC 或者-shared

-shared: 表明产生共享库,
-fPIC:则表明使用地址无关代码。PIC:position independent code.fpic的目的是什么?共享对象可能会被不同的进程加载到不同的位置上,
如果共享对象中的指令使用了绝对地址,外部模块地址,那么在共享对象被加载时就必须根据相关模块的加载位置对这个地址做调整,也就是修改这些地址,让它在对应进程中能正确访问

4,库本身没有问题,但是运行环境里没有动态库依赖的库

执行命令,会显示依赖的库,然后在运行环境里看下是否包含
objdump -x libx.so | grep NEEDED

二,dlopen undefined symbol

对于动态链接库,实际的符号定位是在运行期进行的,在编译.so的时候,如果没有把它需要的库和他一起进行联编,
比如libx.so 需要使用uldict, 但是忘记在编译libx.so的时候加上-luldict的话,在编译libx.so的时候不会报错,
因为这个时候libx.so被认为是一个库,它里面存在一些不知道具体实现的符号是合法的,是可以在运行期指定或者编译另外的二进制程序的时候指定
原文链接:https://blog.csdn.net/prettyshuang/article/details/48676815

三,dlopen unresolved symbols

1,动态库里的API有声明,没有定义。

2,tbd

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐