静态 ZLIB (1.2.8) 链接 Visual Studio 2012

Static ZLIB (1.2.8) linking on Visual Studio 2012

看在上帝的份上,我不能静态化 link ZLIB 库。我已经苦苦挣扎了几个小时,但没有成功。好吧,我遵循了这个 tutorial 并且成功地为 32 位编译了 zlibstat.lib 和 zlibwapi.lib。在将我的项目设置为将 ZLIB 文件夹与库一起使用(链接器 > 常规 > 附加库目录)并将 zlibwapi.lib(仅)设置为依赖项(链接器 > 输入 > 附加依赖项)后,我将其设置为 work,但是,那是一个 dynamic link(我需要使用 ZLIB dll 分发我的应用程序)。我通常在 Debug 上使用动态 linking,在 Release 上使用静态。

我试过寻找 zlibstat.lib 到底是什么以及它的用途,如果不是静态 linking,假设 "stat" 后缀。

是否有任何预处理器要添加到我的项目中,比如 ZLIB_STATIC 之类的东西,以使用 ZLIB 的静态 link ing,或者我是否应该从未从中删除 ZLIB_WINAPI zlibstat项目,就像上面link告诉我的那样? static link ZLIB 是不可能的吗(那么,zlibstat.lib 有什么用?)?

我很迷茫。非常感谢任何帮助。

编辑(额外信息):

错误:

error LNK2001: unresolved external symbol _inflateInit_@12
error LNK2001: unresolved external symbol _inflate@8
error LNK2001: unresolved external symbol _inflateEnd@4

正在链接:

与我添加 zlibwapi.lib 作为依赖项的动态 link (有效)不同,对于我试图实现的静态 linking 我添加了 zlibstat.lib 作为一个依赖项!没有添加其他库!

这个问题可能看起来像 this(有点)。

我终于设法解决了我的问题。对于那些最终遇到此类问题的人,解决方法如下:

如果您按照我的第一个 post 中的教程进行操作,您会从 zlibstat 项目的预处理器中删除 ZLIB_WINAPI。但是,在设置了我自己的使用 ZLIB 的项目(设置 ZLIB 依赖路径、LIB 依赖库等)之后,我 'accidently' included/defined 我正在使用的头文件中该死的 ZLIB_WINAPI 宏ZLIB,就在包含 "zlib.h" 之前。

一件奇怪的事情是,当在调试模式下启动应用程序时(使用动态 linking),一切都成功了并且运行得很好,没有任何警告或任何东西,然而,在发布时模式(使用静态 linking),它崩溃了。

因此,为了解决问题,本教程告诉我们从 zlibstat 项目 中删除 ZLIB_WINAPI 预处理器,它生成静态库,而 zlibvc 项目在其预处理器 中有 ZLIB_WINAPI。换句话说,这意味着如果我们为每个配置使用不同的 linkings (debug/release),我们必须添加或不添加 ZLIB_WINAPI 宏!

如果您使用动态 linking (zlibwapi.lib) 并且 zlibvc[=37=,则在包含 "zlib.h" 之前定义 ZLIB_WINAPI 宏] 项目保持不变(假设您正确地遵循了上面 link 中的教程)并且如果您从 zlibstat 项目中删除了 ZLIB_WINAPI 则不要定义它(例如教程告诉我们)!

我在自己的项目中使用的一个有用的宏如下:

// Since we used dynamic linking for debug, we have to define the ZLIB_WINAPI
#if defined(_WIN32) && defined(_DEBUG)
    #define ZLIB_WINAPI
#endif
#include <zlib.h>

事情变得非常混乱,我真的希望我足够清楚。