我们有一个可执行文件项目,该文件在运行时作为插件加载DLL文件。
我们正在尝试制作一个具有许多库依赖项的新插件,其中一些依赖项是相同的库,但其他插件链接到的版本不同。
因为库受不同版本的不同插件所依赖,所以我想将任何依赖项静态链接/构建到新插件中-这样它们就不会与旧插件依赖项发生冲突。据我所知,插件的依赖项中没有任何内容需要导出,它们仅由插件使用。
是否有可能做到这一点?
我曾尝试在Visual Studio中将所有静态库构建为静态库,并将运行时设置为带有/ MD标志的多线程DLL,但是当我尝试构建dynamiclibB.dll时,出现链接器错误。如果我将dynamiclibB设置为要构建为静态库,则它没有链接器错误。
我还没有尝试过将newplugin.dll链接到dynamiclibB的静态库版本,但是我认为我的情况完全相同,因此我认为没有理由在不降低一级的情况下在这里工作。
无论如何,我都不想将dynamiclibB构建为静态库,因为如果未更改dynamiclibB.dll(例如,以解耦更新过程),则能够在不包括dynamiclibB.dll的情况下更新newplugin.dll将是一件好事。这条推理线暗示我应该为所有内容都使用.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,但它是从其解决方案内部的源代码构建的。我们能够以所需的方式使用该项目的输出,例如使用/ MD标志构建的zlib.lib,而不会链接错误。
我们还设法找出了发生此问题的原因:另一个stackoverflow问题非常相关:https : //stackoverflow.com/a/6559315/78823
事实证明zlib有一个#define ZLIB_WINAPI,它将调用约定定义为STDCALL,我不理解,但这会导致链接器错误。另一个答案建议删除定义,我想这就是libpng对其zlib项目所做的事情。
我猜测链接器错误仅在构建.dll时发生,而在构建.lib时消失的原因是(如果我错了,请更正我,我不能完全理解),构建.lib不会实际上并没有链接到所需的功能,因此只是将链接器错误传递给下一级。我认为在编译newplugin.dll时我们会看到相同的错误(但是可能在不同的objs /项目中),但是在尝试其他事情之前,我们还没有足够的能力来检查它。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句