奇怪的未定义参考错误

时间:2012-09-27 05:58:57

标签: c++ linker-errors sfml

好吧我会尝试详细描述我的问题。 我已经开始使用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)

3 个答案:

答案 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")