Link 在 VS2017 中使用 Qt5.12 静态构建 QuaZip 的 dll

Link dll against static build of QuaZip using Qt5.12 in VS2017

我正在尝试 link 一个 .dll 针对 QuaZip 库的静态构建,以摆脱运行时的 quazip.dll 依赖。由于我 运行 在生产中陷入依赖冲突,因为客户在我的 .dll 未包含的同一进程中使用其他第三方应用程序,这些应用程序也使用 quazip.dll 但旧版本。 我的步骤是首先按照其他帖子中的说明使用 ZLIB_WINAPI 标志静态编译 zlib 依赖项。然后我还使用适当的 ZLIB_WINAPI 标志和 QUAZIP_STATIC 编译了 QuaZip。作为 zlib.h 我已经使用了 QtZlib/zlib.h header 就像这个 推荐的那样。在我的 .dll 项目中,我还尝试设置所有提到的标志(QUAZIP_STATIC 似乎是必要的)。现在,当我尝试编译我的 .dll 时,出现以下错误

1>quazip.lib(zip.obj) : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "__imp__z_deflate@8" in Funktion "_zipCloseFileInZipRaw64@16".
1>quazip.lib(zip.obj) : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "__imp__z_deflateEnd@4" in Funktion "_zipCloseFileInZipRaw64@16".
1>quazip.lib(zip.obj) : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "__imp__z_crc32@12" in Funktion "_zipWriteInFileInZip@12".
1>quazip.lib(unzip.obj) : error LNK2001: Nicht aufgelöstes externes Symbol "__imp__z_crc32@12".
1>quazip.lib(zip.obj) : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_imp__z_deflateInit2@32" in Funktion "_zipOpenNewFileInZip4_64@76".
1>quazip.lib(zip.obj) : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "__imp__z_get_crc_table@0" in Funktion "_zipOpenNewFileInZip4_64@76".
1>quazip.lib(unzip.obj) : error LNK2001: Nicht aufgelöstes externes Symbol "__imp__z_get_crc_table@0".
1>quazip.lib(unzip.obj) : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "__imp__z_inflate@8" in Funktion "_unzReadCurrentFile@12".
1>quazip.lib(unzip.obj) : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "__imp__z_inflateEnd@4" in Funktion "_unzCloseCurrentFile@4".
1>quazip.lib(unzip.obj) : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_imp__z_inflateInit2@16" in Funktion "_unzOpenCurrentFile3@ 20".

所有项目都已使用 /MT 标志构建。

这是我的 linker 命令行

/OUT:"builds\qt5\dll\release\.dll" /MANIFEST /NXCOMPAT /PDB:"builds\qt5\dll\release\.pdb" /DYNAMICBASE "qtmain.lib" "Qt5Core.lib " "Qt5Gui.lib" "Qt5Widgets.lib" "Qt5Sql.lib" "Qt5Network.lib" "Qt5PrintSupport.lib" "qwt.lib" "sloperatecppapi.lib" "slgfw.lib" "slgfwwidget.lib" "slcap.lib" "sltrc.lib" "sltrp.lib" "slhmiutilitieslib.lib" "slaesvcadapter.lib" " slfsfilesvcadapter.lib" "sltraceadapter.lib" "slarchiveadapter.lib" "slmd.lib" "slgfwmanager.lib" "slcncversioninfo.lib" "quazip.lib" "setupapi.lib" "wsock32.lib" "ws2_32.lib" "ucrt.lib" "vcruntime.lib" "msvcrt.lib" "kernel32.lib" "user32.lib" "gdi32.lib" "winspool.lib" "comdlg32.lib" "advapi32.lib" "shell32.lib" "ole32.lib" "oleaut32.lib" "uuid.lib" "odbc32.lib" "odbccp32.lib" /DLL /MACHINE:X86 /SAFESEH /INCREMENTAL:NO /PGD:"builds\qt5\dll\release.pgd " /SUBSYSTEM:WINDOWS /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /ManifestFile:"builds\qt5\dll\release.dll.intermediate.manifest" /ERRORREPORT: PROMPT /NOLOGO /LIBPATH:"S:\hmisl\lib" /LIBPATH:"S:\hmisl\siemens\sinumerik\hmi\osal\ace\lib" /LIBPATH:"S:\hmisl\siemens\sinumerik\hmi\osal\qt\lib" /LIBPATH:".\include\qt5\qwt\lib" /LIBPATH:".\include\qt5\quazip\lib" /LIBPATH:".\include\qt5\modbus\lib" /LIBPATH:".\include\qt5\qtsingleapplication\lib\release" /TLBID:1

如果有任何新提示,我将不胜感激,因为我已经尝试了将近一个星期了,但我 运行 没主意了。

好的,三天的痛苦我找到了解决方案。我重新编译了 zlib,这次没有使用 \contrib\vstudio\vc14 中提供的项目文件,而是使用 CMake 生成了我自己的项目文件。然后 QuaZip 使用标志 QUAZIP_STATIC 链接到它。然后我在我的项目中设置这个标志,它使用 QuaZip 并将其链接到构建的 quazip.lib 及其依赖项 zlibstatic.lib。现在库静态内置到我的 .dll 中,我不再需要提供导致冲突的 quazip.dll。