【问题标题】:Build two interdependent dll构建两个相互依赖的dll
【发布时间】:2010-11-11 08:34:19
【问题描述】:

我必须在这里建立相互依赖的 dll,而不必构建它们两次(强制构建它们并再次重新构建它们以允许链接)。

这是一个例子:

**DLL A**

void fooA()
{
  fooBB();
}
void fooAA()
{
  fooB();
}

**DLL B**

void fooB()
{
  fooA();
}

void fooBB()
{
}

有没有办法在不进行市长重构的情况下构建这两个 DLL?

【问题讨论】:

    标签: c++ windows dll dependencies compilation


    【解决方案1】:

    您可以使用LoadLibaryGetProcAddr 查找函数的地址,然后通过其地址调用 foo-functions。

    以下代码演示了如何执行此操作(您应该在真实的 DLL 中添加错误检查):

    **DLL A**
    
    typedef void fooB(void);
    typedef void fooBB(void);
    fooB* fooB_ptr;
    fooBB* fooBB_ptr;
    HMODULE hDllB;
    
    void init()
    {
      hDllB = LoadLibrary(L"DllB.dll");
      fooB_ptr = reinterpret_cast<fooB*>(GetProcAddr( hDllB, L"fooB" ));
      fooBB_ptr = reinterpret_cast<fooBB*>(GetProcAddr( hDllB, L"fooBB" ));
    }
    
    void done()
    {
      FreeLibrary( hDllB );
    }
    
    void fooA()
    {
      fooBB_ptr();
    }
    void fooAA()
    {
      fooB_ptr();
    }
    

    DLL B 中相同。

    【讨论】:

      【解决方案2】:

      每次编译时你真的重建了这两个 DLL 吗?

      如果不是,则应在第一次创建导入库 - 即使链接阶段由于未解析的外部因素而失败 - 并允许后续构建无错误地链接...

      edit:我们实际上在我的商店中有这种依赖关系。我们的构建确实是增量的,干净的构建需要多次构建一些项目才能成功链接。

      【讨论】:

      • 这就是我现在想要避免的,我想要一种在完整构建时只构建一次的方法。
      • 好吧,如果增量构建真的不是一种选择,我不知道除了 jia3ep 建议的任何其他方式。我想您也可以将其中一个 DLL 更改为静态库。
      • 关键字external 有用吗?我知道它在两个 .obj 之间工作,但它在两个项目之间工作吗?还是可以选择手动编译(VS上的/c)/LINK?如果不是为什么?
      • 如果“external”是指“extern”,则否:虽然它确实会影响符号的可见性,但对于导出符号表尚不存在的情况无济于事。跨度>
      猜你喜欢
      • 2011-04-26
      • 1970-01-01
      • 2021-09-19
      • 1970-01-01
      • 1970-01-01
      • 2015-03-05
      • 2017-03-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多