0

好的,我将尝试详细描述我的问题。我已经开始使用 SFML 的 ziploading API 来从存档中读取游戏资源,我已将所有必需的头文件和源文件放在代码块中的项目中,因此我的项目包含以下内容:

Source files for game
ZipLoader.h
ZipLoader.cpp
ioapi.h
unzip.h
zconf.h
zlib.h

所以在我的游戏菜单标题中,我尝试根据存档中的资源绘制游戏菜单,我有这个:

    #include <SFML/Graphics.hpp>
    #include "Globals.h"
    #include "ZipLoader.h"

class GameMenu
{
    private:
    Zip::File file();

}

基本上,我尝试在其中初始化一个 zip 文件,以便可以在我声明菜单的 gameMenu.cpp 中从中加载。但是我在 ZipLoader.cpp 中遇到了一些非常奇怪的错误,如下所示:

src\ZipLoader.cpp|81|undefined reference to `unzOpen'|
src\ZipLoader.cpp|89|undefined reference to `unzLocateFile'|
src\ZipLoader.cpp|94|undefined reference to `unzOpenCurrentFile'|
src\ZipLoader.cpp|100|undefined reference to `unzGetCurrentFileInfo'|
src\ZipLoader.cpp|105|undefined reference to `unzReadCurrentFile'|
src\ZipLoader.cpp|109|undefined reference to `unzCloseCurrentFile'|
src\ZipLoader.cpp|110|undefined reference to `unzClose'|

但我发现这是不可能的,我想我错过了这个库,但是我把它导入到给我错误的文件中,上面列出的所有方法都位于在unzip.h给我错误的文件中导入的文件中,如下所示:

#include "ZipLoader.h"
#include <SFML/System.hpp>
#include <iostream>
#include <fstream>
#include "unzip.h"

...
unzFile ZipHandle=unzOpen(DataFile); // error????

正如您在下面看到的,在 unzip.h 中,这些引用非常好:

extern unzFile ZEXPORT unzOpen OF((const char *path));
extern unzFile ZEXPORT unzOpen2 OF((const char *path,
                                    zlib_filefunc_def* pzlib_filefunc_def));
    extern int ZEXPORT unzClose OF((unzFile file));

这是迄今为止我在 C++ 程序中遇到的最奇怪的错误,当它就在那里时,它怎么可能是未定义的?(我使用的是 Windows XP SP3)

4

3 回答 3

1

我想,您忘记将 zlib 添加到库列表中。

如果您使用的是 MSVC,请转到您的项目设置,打开链接器设置并将 zlib.lib(我相信这是 win32 的 libz 的文件名)添加到附加依赖项。

如果您使用的是 gcc,请将-lzlib(或者是-lz吗?)添加到您的命令行。

于 2012-09-27T06:06:34.543 回答
1

你在头文件中声明了你的函数,所以你不应该有编译错误。您的问题是,在链接过程中,您没有包括包含这些函数实现的库。

您必须知道这些文件在哪里并将它们包含在链接过程中。

于 2012-09-27T06:07:51.973 回答
1

我对 unzGoToFirstFile 有一个非常相似的问题。如果您下载 ZLib 源代码并执行简单的“grep -irl unzGoToFirstFile”,您会发现这些函数根本不是 ZLib 的一部分。然而,它们是 ZLib 源代码中名为 minizip 的贡献库的一部分。

将此添加到靠近底部的 ZLib CMakeLists.txt 中,它将创建一个名为“libunzip.a”的库,其中包含所需的 unzGoToFirstFile 等功能。只需将您的程序链接到那个,您就应该是金色的。

set(UNZIP_SOURCES "contrib/minizip/unzip.c"
"contrib/minizip/zip.c"
"contrib/minizip/ioapi.c")
set(UNZIP_HEADERS "contrib/minizip/unzip.h"
"contrib/minizip/zip.h"
"contrib/minizip/ioapi.h")

add_library(unzip STATIC 
"${UNZIP_SOURCES}"
"${UNZIP_HEADERS}")

target_link_libraries(unzip zlibstatic)

install(TARGETS unzip
RUNTIME DESTINATION "${INSTALL_BIN_DIR}"
ARCHIVE DESTINATION "${INSTALL_LIB_DIR}"
LIBRARY DESTINATION "${INSTALL_LIB_DIR}" )

install(FILES ${UNZIP_HEADERS} DESTINATION "${CMAKE_INSTALL_PREFIX}/include")
于 2016-10-09T11:14:23.813 回答