在Visual Studio 2012上静态链接ZLIB (1.2.8)。

8
我真的做不到,为了上帝的爱,静态链接ZLIB库。我已经努力了几个小时,但没有成功。好吧,我遵循了这个教程并成功编译了32位zlibstat.lib和zlibwapi.lib。在将我的项目设置为使用包含库的ZLIB文件夹(连接器>常规>附加库目录)并将zlibwapi.lib(仅此)设置为依赖项(连接器>输入>附加依赖项)之后,我使它工作了,但那是一个动态链接(我需要分发带有ZLIB dll的应用程序)。我通常在Debug上使用动态链接,在Release上使用静态链接。

我尝试查找zlibstat.lib到底是什么以及它的用途是什么,如果不是用于静态链接,则假定具有“stat”后缀。

是否应该向我的项目中添加任何预处理程序,例如ZLIB_STATIC或其他内容,以使用ZLIB的静态链接,或者我不应该从zlibstat项目中删除ZLIB_WINAPI,就像上面的链接告诉我的那样?无法静态链接ZLIB(那么,zlibstat.lib是用于什么?)?

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

编辑(额外信息):

错误:

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

链接:

与动态链接不同(它可以正常工作),在我尝试实现静态链接时,我添加了zlibstat.lib作为依赖项!没有添加任何其他库!

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

1个回答

7

我终于解决了我的问题。对于那些遇到这种问题的人,以下是解决方法:

如果您按照我第一篇帖子中的教程操作,您将从zlibstat项目的预处理器中删除ZLIB_WINAPI。然而,在设置了使用ZLIB的自己的项目(设置了ZLIB依赖路径、LIB依赖库等)后,“不小心”在使用ZLIB的头文件之前包含/定义了该可恶的ZLIB_WINAPI宏。

有趣的是,在调试模式下启动应用程序(使用动态链接),一切都成功了,没有任何警告或其他问题,但是,在发布模式下(使用静态链接),它崩溃了。

因此,为了澄清事情,该教程告诉我们要从生成静态库的zlibstat项目中删除ZLIB_WINAPI预处理器,而ZLIB_WINAPI在其预处理器中的zlibvc项目。换句话说,这意味着如果我们为每个配置(调试/发布)使用不同的链接,我们必须添加或不添加ZLIB_WINAPI宏!

如果您正在使用动态链接(zlibwapi.lib),请在包含“zlib.h”之前定义ZLIB_WINAPI宏,并且zlibvc项目保持不变(假设您正确地按照上面链接中的教程操作),如果您从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>

事情变得非常混乱,我真的希望我表达清楚了。


请问您能否更清楚地解释一下链接Zlib静态库的步骤。我遇到了同样的问题。谢谢。 - X6Entrepreneur

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接