Ошибка компоновки при настройке функций zcalloc и zcfree в библиотеке zlib
При интеграции библиотеки 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
в файле deflate.c из исходного кода ZLIB, и предположим, что эта функция не может найти реализацию двух функций zcfree adn zcalloc. Причина в том, что библиотека Nurbs настраивает функции zcfree и zcalloc, что выполняется в два этапа.
Cusomize 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); }
- Скомпилируйте библиотеку ZLIB с флагом: MY_ZCALLOC и Z_PREFIX
Как я проверил, оба эти шага выполнены, но почему я все еще получил ошибку компоновки.
Не могли бы вы дать мне несколько советов? Спасибо!
Обновление: @Dale Lear: спасибо за вашу поддержку. Но моя ситуация другая. Вместо этого, при связывании с opennurbs.lib, я попытался интегрировать исходный код opennurbs в мой проект (например, поверхностный модуль библиотеки облаков точек: http://www.pointclouds.org/blog/trcs/moerwald/). Я строю zlib из проекта zlib в решении opennurbs. Этот zLib построен с использованием модифицированного zconfig.h (Z_PREFIX и Z_MYCALL, я так думаю, определены). Это означает, что функции zfree и zalloc все еще ожидают реализации. Но почему ZLib не берет zcfree() и zcalloc из opennurbs_zlib_memory.cpp. Я не понимаю, зачем это нужно.
1 ответ
Из вашего описания и журнала ошибок, который вы предоставили, я предполагаю, что ситуация такова:
1) Вы создаете программу для Windows с использованием некоторой версии компилятора Microsoft C++.
2) Вы хотите статически связать с zlib.lib
3) Вы хотите статически связать с opennnurbs_staticlib.lib
Я не могу определить, какую версию компилятора Microsoft C++ или opennurbs вы используете.
Если вы используете последний публичный выпуск opennurbs (версия 2013-07-11), то функции zcfree() и zcalloc() определены в файле opennurbs_zlib_memory.cpp.
Если вы соберете opennurbs_staticlib.lib, используя файл проекта opennurbs_staticlib.vcxproj, который включен в исходный код, он скомпилирует opennurbs_zlib_memory.cpp и включит в него функции zcfree() и zcalloc() в opennurbs_staticlib.lib. Если вы собираете zlib с использованием кода zlib и файла zlib/zlib.vcxproj, который включен в opennurbs 2013-07-11, то он будет собран со всеми необходимыми определениями, и у вас будет две статические библиотеки, zlib.lib и opennurbs_staticlib. lib, эта связь со всеми зависимостями разрешена.
Если вы используете настраиваемые файлы проекта, первое, что нужно проверить, это то, что вы статически связываете результаты компиляции opennurbs_zlib_memory.cpp каким-то образом.
Если вы хотите использовать opennurbs в качестве DLL, я бы предложил создать opennurbs.dll с файлом проекта opennurbs.vcxproj, который поставляется с исходным кодом. Этот opennurbs.dll будет статически включать zlib.lib, когда он ссылается, и вам не нужно связываться ни с чем, кроме получившегося файла opennurbs.lib, чтобы использовать версию DLL.
Это помогает?
- Дейл Лир