链接器踩坑

本文记录了一次因SDK更新引发的库冲突问题,引发了对链接器工作原理的探讨。通过实验发现,链接器按指定顺序遍历库文件查找符号,选择最先遇到的实现,而不是所有相同符号的合并。这解释了库交换顺序导致的不同链接结果,并证实了链接器未记录库中符号的细节。
摘要由CSDN通过智能技术生成

在工作中遇到一次,项目更新一个sdk的后,发现另一个没有改动的sdk提供的功能无法生效了。仔细排查后,发现是因为升级后的sdk包含了与另一个已有sdk同名的库(大概率内部一些接口也是一致的),猜测这里出了问题。遂对链接器的一些实现产生了好奇,做了一个简单的实验,这里记录一下。

对链接器的一些疑问

  • 从经验看,CMakeLists文件只是简单的使用target_link_libraries之类的接口添加一个project需要链接的库,却没有任何地方指明了更进一步的链接细节,比如某个class A需要到具体的a.lib里面去寻找定义。那么势必导致两个结果:
    • lib的名字不影响具体的链接。如果一个project同时链接了a.libb.lib,那么交换ab的名字,不应该影响链接结果(这里以交换文件名距离,是因为需要保证改名后的lib仍然是可以被定位到的。直接把a.lib改成a1.lib可能会找不到)
    • 符号是通过遍历库来查找的。因为并没有任何一个统一的表,注明了各个待链接的库包含了哪些符号,那么链接想想查找某个符号的时候,唯一可行的办法只有通过遍历各个库,查看是否有声明的符号。
    • 在上一条的背景下,如果多个库里含有相同的符号,那具体链接器会怎么做,其实是不一定的了(取决于链接器的实现)。下面这个实验就验证了这一点。

Activiti是一个流程引擎,用于管理和执行工作流程。在使用Activiti时,有一些常见的问题和需要注意。以下是一些可能会遇到的问题和解决方法: 1. 数据库问题:Activiti使用数据库来存储流程实例、任务、历史数据等。在使用Activiti之前,确保已正确配置并连接了数据库。 2. 配置问题:Activiti需要一个activiti.cfg.xml文件来配置引擎的属性,如数据库连接信息和流程定义文件的位置。确保配置文件正确地指定了这些属性。 3. 流程定义问题:在部署流程定义时,确保流程定义文件(通常是一个BPMN文件)位于正确的位置,并且包含了正确的流程定义和任务。 4. 用户任务问题:如果你在流程中使用了用户任务,确保在任务分配给用户之前,已经创建了相应的用户或用户组,并且用户具有执行该任务的权限。 5. 并发问题:当多个用户同时执行流程时,可能会出现并发问题。确保在设计流程时考虑到并发情况,并使用适当的锁机制来处理共享资源。 6. 异常处理问题:在执行流程过程中可能会出现异常情况,如任务超时或执行失败。确保适当地处理这些异常,并记录错误信息以便后续排查。 7. 版本问题:如果你更新了流程定义或者修改了流程模型,确保在部署新版本之前,旧版本的流程实例已经完成或被中止。 这些是一些常见的Activiti问题,希望对你有所帮助。如果你有具体的问题或者其他方面的疑问,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值