0

在将 Nurbs 库 ( http://www.rhino3d.com/opennurbs ) 集成到我的项目中时,我遇到了与库 zlib 的以下链接错误。

1>zlib.lib(deflate.obj) : error LNK2019: unresolved external symbol _zcfree referenced in     function _z_deflateInit2_
1>zlib.lib(inflate.obj) : error LNK2001: unresolved external symbol _zcfree
1>zlib.lib(deflate.obj) : error LNK2019: unresolved external symbol _zcalloc referenced in     function _z_deflateInit2_
1>zlib.lib(inflate.obj) : error LNK2001: unresolved external symbol _zcalloc 

我检查了功能

z_deflateInit2

在 ZLIB 源代码的deflate.c文件中,猜测这个函数找不到zcfree和zcalloc两个函数的实现。原因是Nurbs 库自定义了函数zcfreezcalloc,分两步完成。

  1. 在 Nurbs 库代码中自定义 zcalloc和zcfree

    opennurbs_zlib.h
    extern "C" {
        voidpf zcalloc (voidpf, unsigned, unsigned);
        void  zcfree (voidpf, voidpf);
    }
    

    这两个函数在文件opennurbs_zlib_memory.cpp中实现如下

    #define voidpf z_voidpf
    voidpf zcalloc (voidpf, unsigned items, unsigned size)
    {
        return oncalloc(items, size);
    }
    
    void  zcfree (voidpf, voidpf ptr)
    {
        onfree(ptr);
    }
    
  2. 使用标志编译 ZLIB 库:MY_ZCALLOC 和 Z_PREFIX

正如我检查的那样,这两个步骤都已完成,但是为什么我仍然遇到链接错误。

你能给我一些建议吗?非常感谢!

更新:@Dale Lear:感谢您的支持。但我的情况不同。相反,如果与opennurbs.lib链接,我尝试将opennurbs的源代码集成到我的项目中(如点云库的表面模块:http ://www.pointclouds.org/blog/trcs/moerwald/ )。我从 opennurbs 解决方案中的 zlib 项目构建 zlib。这个 zLib 是用修改后的 zconfig.h 构建的(Z_PREFIX 和 Z_MYCALL,我猜是这样定义的)。这意味着函数 zfree 和 zalloc 仍在等待执行。但是为什么ZLib没有从opennurbs_zlib_memory.cpp中取zcfree()和zcalloc。我不明白为什么需要。

4

1 回答 1

1

根据您的描述和您提供的错误日志,我猜情况是:

1) 您正在使用某些版本的 Microsoft 的 C++ 编译器构建 Windows 程序。

2)您想与 zlib.lib 静态链接

3)您想与 opennnurbs_staticlib.lib 静态链接

我无法确定您使用的是什么版本的 Microsoft 的 C++ 编译器或 opennurbs。

如果您使用的是 opennurbs 的最新公开版本(版本 2013-07-11),则 zcfree() 和 zcalloc() 函数在文件 opennurbs_zlib_memory.cpp 中定义。

如果您使用源代码中包含的 opennurbs_staticlib.vcxproj 项目文件构建 opennurbs_staticlib.lib,它将编译 opennurbs_zlib_memory.cpp 并在 opennurbs_staticlib.lib 中包含 zcfree() 和 zcalloc() 函数。如果您使用 opennurbs 2013-07-11 中包含的 zlib 代码和 zlib/zlib.vcxproj 文件构建 zlib,那么它将使用所有必要的定义构建,并且您将拥有两个静态库,zlib.lib 和 opennurbs_staticlib。 lib,与所有依赖项的链接已解决。

如果您使用的是自定义项目文件,首先要检查的是您是否以某种方式静态链接了编译 opennurbs_zlib_memory.cpp 的结果。

如果您想将 opennurbs 用作 DLL,我建议使用源代码附带的 opennurbs.vcxproj 项目文件构建 opennurbs.dll。此 opennurbs.dll 将在链接时静态包含 zlib.lib,您无需链接任何内容,除了生成的 opennurbs.lib 即可使用 DLL 版本。

这有帮助吗?

——戴尔·李尔

于 2014-07-23T16:37:06.653 回答