我们有一个可执行的项目,它在运行时以插件的形式加载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
将其余部分放在答案中。
答案 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 /项目中),但是在我们尝试其他事情之前,我们还没有做足够的检查。