Ошибка связывания при настройке функций 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 и zcalloc. Причина в том, что библиотека Nurbs настраивает функции zcfree и zcalloc, что выполняется в два этапа.

  1. Настройте 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);
    }
    
  2. Скомпилируйте библиотеку 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. Я не понимаю, зачем это нужно.


person khanhhh89    schedule 22.07.2014    source источник


Ответы (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.

Это помогает?

-- Дейл Лир

person Dale Lear    schedule 23.07.2014