DLL链接到静态库

林登·希尔兹

我们有一个可执行文件项目,该文件在运行时作为插件加载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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

将静态库链接到dll

来自分类Dev

将静态库链接到共享库

来自分类Dev

Delphi静态或动态链接到Windows dll

来自分类Dev

链接到Xcode中的库-静态或动态

来自分类Dev

将SFML静态库链接到项目

来自分类Dev

创建并链接静态锈库并链接到c

来自分类Dev

是什么原因阻止我无法将VS2010中的静态库正确链接到我的.dll,

来自分类Dev

Android将许多静态库链接到共享库

来自分类Dev

将静态库链接到共享库并隐藏导出的符号

来自分类Dev

如何创建自动链接到动态库的静态库?

来自分类Dev

使用automake将共享库链接到静态libtool库

来自分类Dev

如何创建自动链接到动态库的静态库?

来自分类Dev

将程序链接到静态库,将自身链接到另一个库

来自分类Dev

将C编译的静态库链接到C ++程序

来自分类Dev

使用CMake链接到Windows上的静态库的问题

来自分类Dev

QtCreator-无法链接到静态库(ld错误)

来自分类Dev

如何使用Visual D链接到静态库中的包

来自分类Dev

静态链接到非二进制库

来自分类Dev

将依赖关系链接到静态库?

来自分类Dev

无法在Linux上使用Mingw链接到静态库

来自分类Dev

无法在Linux上使用Mingw链接到静态库

来自分类Dev

使用GCC链接到静态库时遇到问题

来自分类Dev

是否可以将macfuse链接到C ++静态库?

来自分类Dev

如何将C ++静态库链接到C程序?

来自分类Dev

将依赖关系链接到静态库?

来自分类Dev

Qt5.1.0静态链接,“此应用程序不能静态链接到fftreal库”

来自分类Dev

DLL 从静态链接库中导出函数符号

来自分类Dev

静态链接到 libopenblas

来自分类Dev

链接器如何处理链接到共享库的C ++静态库的唯一typeinfo约束?

Related 相关文章

热门标签

归档