在zlib库中自定义zcalloc和zcfree函数时链接错误



在将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 

I check the function

z_deflateInit2

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

  1. 自定义zcalloczcfree在Nurbs库代码。

    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. 编译带有MY_ZCALLOC和Z_PREFIX标志的ZLIB库

正如我所检查的,这两个步骤都完成了,但为什么我仍然得到链接错误。

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

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

从你的描述和你提供的错误日志,我猜情况是:

1)你正在用微软的c++编译器构建一个Windows程序。

2)你想静态链接zlib.lib

3)你想静态链接opennnurbs_staticlib.lib

我无法确定你使用的是哪个版本的微软c++编译器或opennurbs。

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

如果你构建opennurbs_staticlib。使用opennurbs_staticlib. Lib。它将编译opennurbs_zlib_memory.cpp,并在opennurbs_staticlib.lib中包含其中的zcfree()和zcalloc()函数。如果您使用zlib代码和zlib/zlib。Vcxproj文件包含在opennurbs 2013-07-11中,然后它将与所有必要的定义一起构建,并且您将拥有两个静态库zlib。Lib和opennurbs_staticlib。

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

如果你想使用opennurbs作为DLL,我建议使用opennurbs. DLL来构建opennurbs. DLL。源代码附带的Vcxproj项目文件。这个opennurbs.dll将静态地包含zlib。Lib当它链接时,你不需要链接任何东西,除了结果的opennurbs。

这有帮助吗?

—Dale Lear

相关内容

  • 没有找到相关文章

最新更新