linux动态库so调用外部so,运行时出现undefined symbol

出现这种问题,一般为某工程的动态链接库出现问题,一般为以下解决办法:
一、当前工程的.so文件和生成该.so文件的工程代码不一致,当前.so文件中不包含工程代码中的某些函数。例如我的工程代码中有NdarrytoImage()这个函数,但是我使用的.so生成时却没有该函数,则在编译的时候不包含NdarrytoImage函数,则会抛出no ndarrytoimage undefined symbol,
解决办法为将包含那个函数的工程代码重新编译,然后复制到目录中即可。

二、首先排查,C++调用了c的库?是不是需要加上extern “c”,尤其是类的动态库,需要用到工厂模式,create一个对象出来,该工厂函数需要extern “c”声明。

extern “C” CDbBase* create();
extern “C” void destroy(CDbBase* p);

CDbBase* create()
{
return new CDbDb2;
}


void destroy(CDbBase* p)
{
printf(“destroy CDbDb2!\n”);
   delete p;
}


三、使用ldd -r xxx.so或者 nm -A xxx.so等命令,查看so有哪些符号未定义的。


四、在步骤2发现有很多未定义的符号,跟运行时undefined symbol符合,而且该符号是外部的系统的动态库里定义的,那目标就定位到自己写的动态库里,链接的过程时,是否把这些动态库给链接进来。

查找发现makefile编译动态库时,找不到链接符号也是允许编译通过的,那最好是加上限制条件,在makefile加上 -Xlinker –unresolved-symbols=ignore-in-shared-libs ,让其报错,把未定义的符号给报错出来。


五、根据makefile的报错,原来是忘了把外部动态库给 -l进来,并把动态库路径-L进来,即可。

        </div>
            </div>
.so: undefined symbol表示在动态库中找不到某个符号的定义。这个错误通常意味着在链接过程中,动态库依赖的某个符号没有被正确地解析和链接。这可能是由于以下几个原因导致的: 1. 编译顺序问题:如果动态库的编译顺序不正确,即依赖的符号在链接时还没有被定义,就会出现undefined symbol错误。在这种情况下,可以尝试重新安排编译顺序,确保依赖的库先被编译。 2. 缺失依赖库:如果动态库依赖的某个其他库没有被正确地链接,也会导致undefined symbol错误。在这种情况下,可以检查库的依赖关系,确保所有的依赖库都被正确地链接。 3. 版本不匹配:如果动态库依赖的符号的版本与实际使用的版本不匹配,也会导致undefined symbol错误。在这种情况下,可以尝试更新库的版本,或者检查编译选项是否正确。 对于解决这个问题,可以按照以下步骤进行排查和修复: 1. 使用ldd命令查看动态库的依赖关系,确保所有的依赖库都被正确地链接。 2. 使用nm命令查看动态库中的符号表,检查是否存在未定义的符号。 3. 检查编译选项和链接选项,确保正确地指定了依赖库和版本。 4. 确认编译顺序是否正确,按照依赖关系重新安排编译顺序。 通过以上步骤,您应该能够找到并解决.so: undefined symbol错误。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [linux动态库so调用外部so,运行时出现undefined symbol](https://blog.csdn.net/qq_31511955/article/details/82656072)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [qt Qlibray加载.so文件报错undefined symbol排查记录](https://blog.csdn.net/weixin_42148156/article/details/127352696)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值