DLL链接到静态库

DLL linking to static libraries

我们有一个可执行项目,它在 运行 时加载 DLL 文件作为插件。

我们正在尝试制作一个具有许多库依赖项的新插件,其中一些依赖项是相同的库,但与其他插件 link 的版本不同。

因为库依赖于不同版本的不同插件,我想静态 link/build 任何依赖到新插件中 - 这样它们就不会与旧插件依赖冲突。据我所知,插件的依赖项中没有任何内容需要导出,它们只是由插件使用。

可以这样做吗?

我已经尝试将 visual studio 中的所有静态库构建为静态库,并将 运行time 设置为带有 /MD 标志的多线程 DLL,但是当我尝试构建 dynamiclibB.dll,我收到 linker 错误。如果我将 dynamiclibB 设置为构建为静态库,它不会出现 linker 错误。

我还没有尝试 linking newplugin.dll 到 dynamiclibB 的静态库版本,但我认为我遇到的情况完全相同,所以我看不出它在那里工作的原因它没有下降一级。

无论如何我都不想将 dynamiclibB 构建为静态库,因为能够更新 newplugin.dll 而不包括 dynamiclibB.dll 如果它没有被更改,那将是很好的,因为in,解耦更新过程。这种推理表明我应该为所有内容提供 .dll,但我认为版本冲突才是让我担心的。

我无法将插件构建为静态库,因为它们需要在 运行 时间加载。

现在绝对所有的东西都是在发布模式下构建的,以避免这种复杂化。

我错过了什么?

可能有助于理解情况的图表尝试:

            program.exe
                |
         ________________
        |                |
  oldplugin.dll      newplugin.dll
        |                |
 dynamiclibA.dll     dynamiclibB.dll
                         |
            _________________________
           |             |           |
     staticlibA.lib   slibC.lib    slibD.lib   

更新: 现在我知道发生了什么,并且知道更具体的细节实际上是相关的,现在提供更多信息。 所以由 dynamiclibA 和 staticlibA 代表的库 A 是 zlib。 我们正在编译(dynamiclibB)用于新插件的库是 PoDoFo。 我们收到的错误消息是:

Error   19  error LNK2001: unresolved external symbol
_deflateInit_   E:\Work\podofo_bin\src\PdfFiltersPrivate.obj    podofo_shared Error 20  error LNK2001: unresolved external symbol
_inflateEnd E:\Work\podofo_bin\src\PdfFiltersPrivate.obj    podofo_shared Error 21  error LNK2001: unresolved external symbol
_inflateEnd E:\Work\podofo_bin\src\libpng16.lib(pngread.obj)    podofo_shared Error 22  error LNK2001: unresolved external symbol
_deflate    E:\Work\podofo_bin\src\PdfFiltersPrivate.obj    podofo_shared Error 23  error LNK2001: unresolved external symbol
_deflate    E:\Work\podofo_bin\src\libpng16.lib(pngwutil.obj)   podofo_shared Error 24  error LNK2001: unresolved external symbol
_deflateEnd E:\Work\podofo_bin\src\PdfFiltersPrivate.obj    podofo_shared Error 25  error LNK2001: unresolved external symbol
_deflateEnd E:\Work\podofo_bin\src\libpng16.lib(pngwrite.obj)   podofo_shared Error 26  error LNK2001: unresolved external symbol
_inflateInit_   E:\Work\podofo_bin\src\PdfFiltersPrivate.obj    podofo_shared Error 27  error LNK2001: unresolved external symbol
_inflateInit_   E:\Work\podofo_bin\src\libpng16.lib(pngrutil.obj)   podofo_shared Error 28  error LNK2001: unresolved external symbol
_inflate    E:\Work\podofo_bin\src\PdfFiltersPrivate.obj    podofo_shared Error 29  error LNK2001: unresolved external symbol
_inflate    E:\Work\podofo_bin\src\libpng16.lib(pngrutil.obj)   podofo_shared

将其余部分放在答案中。

在我的问题中,slibc.lib 是 libpng。 Libpng 也需要 zlib,但它是从其解决方案中的源代码构建的。我们能够按照我们希望的方式使用该项目的输出,例如 zlib.lib 使用 /MD 标志构建,没有链接错误。

我们还设法解决了为什么会出现这个问题: 另一个 Whosebug 问题非常相关:

原来 zlib 有一个 #define ZLIB_WINAPI 定义了调用约定为 STDCALL,我不明白,但它导致了链接器错误。另一个答案建议删除定义,我想这就是 libpng 对其 zlib 项目所做的。

我猜测链接器错误仅在构建 .dll 时出现而在构建 .lib 时消失的原因是(如果我错了请纠正我,我不完全理解这一点),构建一个 .lib 实际上并没有链接到所需的函数,所以只会将链接器错误传递到下一个级别;我认为我们在编译 newplugin.dll 时会看到相同的错误(但可能在不同的 objs/projects 中),但在我们尝试其他事情之前我们没有深入检查。