在将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库自定义函数zcfree和zcalloc,这分两步完成。
自定义zcalloc和zcfree在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); }
- 编译带有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