qq_36601357 2018-10-10 16:57 采纳率: 75%
浏览 1557
已采纳

如何使同一个lib静态库能被链接入程序接两次?

一个lib文件,一个对应的.h文件。在一个程序中的不同源文件中,都include了这个.h,并且调用了该lib的同一个方法。比如,有test.h和test.lib,方法为add(int ,int)。lib文件直接加到工程设置中。
AA.cpp:
#include "test.h"
AA::AA()
{
add(3,4);
}

demo.cpp
#include "test.h"
int main()
{
add(3,4);
AA a;
return 0;
}
对两处add下断点可以看到,call跳转的是同一地址。也就是说,这个lib虽然被多次用到,但只被编译到程序一次。

有什么办法能让lib被链接进来两次,使两次add调用跳转到不同的地址呢?

  • 写回答

4条回答 默认 最新

  • huhuren12 2018-10-13 09:44
    关注
            你这个问题其实没有意义,如果你的静态库里的函数是用C写的,或者是C++写的不包含在类成员里面,或者包含在类里面但是是静态库,那么编译完成后这个函数的地址就固定了,而且只会有一个,不会变的,变了就不正常了,不管你想什么方式都没用的。如果是C++的类成员的话,只要不是静态成员,那么你在使用该函数之前就会类实例化,只要不是相同的类实例化,那么你即便是调用的同一个函数也不会是相同的地址。
    
    
    
     按照你提出来的问题,我猜你大概是碰到了函数重入性的问题了,你的静态库里的函数是不可重入的,但是你在使用中又在多个线程或进程中调用了该函数,或者在同一个线程中调用了静态库中的函数,但是该函数自身又和其他线程有联系,导致数据出错。想让静态lib被连接两次,只能改变静态库的名称,函数名称等方式来做。但是感觉你要解决的不是让lib被链接进来两次,而是要解决静态库中函数的可重入问题,而要解决函数的可重入问题网上很多,按照你现在的情况可以有以下2种选择(任选其一即可):
    1:修改lib库中的函数,将其改成可重入的函数
    2:在调用该函数时,增加互斥功能,保证在该函数运行期间不会别其他线程调用
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?