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

  1. 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);
    }
    
  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. Я не понимаю, зачем это нужно.

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.

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

- Дейл Лир

Другие вопросы по тегам