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条)

报告相同问题?

悬赏问题

  • ¥15 HFSS 中的 H 场图与 MATLAB 中绘制的 B1 场 部分对应不上
  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?