好吧我会尝试详细描述我的问题。 我已经开始使用SFML的ziploading API来从存档中读取游戏资源,我已经在Codeblock中的项目中放置了所有必需的头文件和源文件,因此我的项目包含以下内容:
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)
答案 0 :(得分:1)
我想,您忘了将zlib添加到库列表中。
如果您正在使用MSVC,请转到您的项目设置,打开链接器设置并将zlib.lib(我相信这是win32的libz的文件名)添加到其他依赖项。
如果您正在使用gcc,请将-lzlib
(或者-lz
?)添加到您的命令行。
答案 1 :(得分:1)
您在头文件中声明了您的函数,因此您不应该编译错误。您的问题是,在链接过程中,您不包括包含这些函数实现的库。
您必须知道这些文件的位置并将其包含在链接过程中。
答案 2 :(得分:0)
我和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")