【问题标题】:Compiler doesn't find reference to zip_get_num_entries on Windows编译器在 Windows 上找不到对 zip_get_num_entries 的引用
【发布时间】:2013-02-22 11:47:15
【问题描述】:

我想在我的 C++ 程序中使用 libzip 从 zip 存档中提取文件。因此,首先,我获取其中的文件数量,获取它们的名称并阅读它们。要获取文件数,我使用“zip_get_num_entries”。它的原型是:

zip_uint64_t zip_get_num_entries(struct zip *, int)

以及我使用这个功能的方式:

int nbrEntries(0);
zip *archive = zip_open("myZip.zip", 0, 0);
nbrEntries = zip_get_num_entries(archive, 0);

当我编写这段代码时,Code::Blocks 建议我使用 zip_get_num_entries,所以标题没有问题。但是当我编译时,编译器(MinGW)告诉我:

undefined reference to `_imp__zip_get_num_entries'

所以我尝试了它已弃用的等效项 zip_get_num_files 并且它有效。我将使用 CMake 制作的项目 libzip.dll.a 包括在内。我有两个文件:libzip.dll 和 libzip.dll.a。

我确定这是一个库问题(请注意,我在 MacOS 上没有这个问题),但我不知道如何解决这个问题。谢谢!

编辑:我搜索了他们的网站,发现 zip_get_num_files 的实现是新的,当他们发布网站上可用的库时。所以我在他们的 Mercurial repo 中搜索并找到了 2 天前发布的版本(比网站上发布的版本更新了一点,它有将近 1 年)。我用 CMake 构建了它,并且成功了!

【问题讨论】:

    标签: c++ dll zip cmake


    【解决方案1】:

    “未定义的引用”意味着没有可用的函数的定义/实现(与声明/原型相反)。您忘记链接该库。由于您将 MinGW 与 g++ 一起使用,因此它将在命令行上使用类似于 -lzip 的内容或作为 LDFLAGS 的一部分。

    您也有可能错误地配置了某些东西 - 在这种情况下,符号名称可能会因定义而异。但最可能的情况是您忘记链接依赖项。

    【讨论】:

    • 我在项目构建选项的菜单“编译器设置”>“其他选项”中添加了 -lzip,但总是有相同的消息:-/ 我可能配置错误了什么?
    • 哦,我的程序编译成功了!!我从他们的 Mercurial repo 下载了一个更新的版本,它工作了! hg.nih.at/libzip/rev/3bf116d0b3e9
    【解决方案2】:

    我终于成功使用了zip_get_num_entries!我搜索了他们的网站,发现 zip_get_num_files 在他们发布网站上可用的库时是新的。所以我在他们的 Mercurial repo 中搜索并找到了 2 天前发布的版本(比网站上发布的版本更新了一点,它有将近 1 年)。我用 CMake 构建了它,并且成功了!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多