DLL链接到静态库

时间:2015-01-22 03:37:38

标签: c++ visual-studio-2010 dll static-libraries

我们有一个可执行的项目,它在运行时以插件的形式加载DLL文件。

我们正在尝试创建一个具有许多库依赖项的新插件,其中一些依赖项是相同的库,但其他插件链接到的版本不同。

因为这些库依赖于不同版本的不同插件,所以我想静态地将任何依赖项链接/构建到新插件中 - 这样它们就不会与旧的插件依赖项发生冲突。据我所知,插件的依赖项中没有任何东西需要导出,它们只是被插件使用。

是否可以这样做?

我尝试将visual studio中的所有静态库构建为静态库,并将运行时设置为带有/ MD标志的多线程DLL,但是当我尝试构建dynamiclibB.dll时,我收到了链接器错误。如果我将dynamiclibB设置为构建为静态库,则它没有链接器错误。

我还没有尝试将newplugin.dll链接到dynamiclibB的静态库版本,但我认为我有完全相同的情况,所以我认为没有理由为什么它会在那里没有一个级别下降。

我不想将dynamiclibB构建为静态库,因为能够更新newplugin.dll而不包括dynamiclibB.dll(如果它尚未更改,如同),以解除更新处理。这种推理方式表明我应该拥有.dll用于所有内容,但我认为版本的冲突让我担心。

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

目前,一切都在发布模式下构建,以避免这种复杂化。

我错过了什么?

尝试使用可能有助于了解情况的图表:

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

更新 现在我知道发生了什么,提供更多信息,并且知道更具体的细节实际上是相关的。 因此,由dynamiclibA和staticlibA表示的库A是zlib。 我们正在编译的库(dynamiclibB)用于newplugin是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

将其余部分放在答案中。

1 个答案:

答案 0 :(得分:0)

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

我们还设法解决了 为什么 出现此问题: 另一个stackoverflow问题非常相关:https://stackoverflow.com/a/6559315/78823

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

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