qq_36601357
qq_36601357
采纳率75%
2018-10-10 16:57

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

40
已采纳

一个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条回答

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

    这个是cocos2d引擎遇到的。情况是这个样的,有个glfw.lib库,我把引擎的源码部分叫做引擎内部,我自己写的源码叫外部,那么内部调用这个库的地址是一致的,而外部调用又是另一个地址,链接了两次。比如这样:外部A.cpp和内部GlView.cpp有如下源码:
    A.cpp:
    //....
    glfwInit();
    glfwInit();
    GLVIiew::gInit();
    //.....

    GLView.cpp:
    void GLView::gInit(){
    glfwInit();
    glfwInit();
    }
    就这种情况下,A中两个init是同一地址,GLview中两处是另外的地址。由于A中两个init先调用,

    这两个返回都是true,而GLview的就会返回false。相反,如果在A中写成先调用

    GLView::gInit(),那么GLview的init就会返回true,A中的会失败。也就是说,先调用的一方成功

    ,后来的失败。

    点赞 评论 复制链接分享
  • phenix2009 白色一大坨 3年前

    你这个,不是库问题,是你调用的方法不对。
    你说你两个地方调用,那么相当于两处地方使用一个资源,在资源使用之前要判断其是否被占用,如果占用则先释放后,再进行操作。
    希望你仔细看一下相关的接口说明,找出正确的使用方法。

    点赞 评论 复制链接分享
  • caozhy 从今以后生命中的每一秒都属于我爱的人 3年前

    lib、h和h里的函数名复制、改名,不同的地方使用不同名称的。

    点赞 评论 复制链接分享

相关推荐