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 中),但在我们尝试其他事情之前我们没有深入检查。
我们有一个可执行项目,它在 运行 时加载 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 中),但在我们尝试其他事情之前我们没有深入检查。