Неразрешенный внешний символ с zlib и libpng. Визуальная студия 2013

Поскольку мне нужно связать со статическими средами выполнения C, я решил создать все как статические библиотеки, о которых идет речь, с той же версией Visual Studio (2013), используя тот же набор инструментов платформы и библиотеки времени выполнения Multi-Threaded / MT

Я пытаюсь привязать свое приложение к стороннему игровому движку. Этот движок построен на основе libpng и zlib. libpng также построен на основе zlib.

Поэтому я создаю zlib с нуля в статическую библиотеку. Затем я создаю libpng и указываю его на zlib в качестве дополнительной зависимости, чтобы zlib был связан с моей статической библиотекой libpng.

Затем я создаю свой игровой движок, связывающийся как с libpng, так и с zlib в качестве дополнительных зависимостей. Компоновщик удаляет второе определение zlib. Пока все строится нормально.

Затем я связываю свое приложение только со статической библиотекой своего игрового движка. Я получаю такие ошибки компоновщика:

    2>libOxygine-vc120-mt-gd.lib(unzip.obj) : error LNK2001: unresolved external symbol _inflate
    2>libOxygine-vc120-mt-gd.lib(pngrutil.obj) : error LNK2001: unresolved external symbol _inflate
    2>libOxygine-vc120-mt-gd.lib(unzip.obj) : error LNK2001: unresolved external symbol _inflateEnd
    2>libOxygine-vc120-mt-gd.lib(pngread.obj) : error LNK2001: unresolved external symbol _inflateEnd
    2>libOxygine-vc120-mt-gd.lib(unzip.obj) : error LNK2001: unresolved external symbol _crc32
    2>libOxygine-vc120-mt-gd.lib(png.obj) : error LNK2001: unresolved external symbol _crc32
    2>libOxygine-vc120-mt-gd.lib(unzip.obj) : error LNK2001: unresolved external symbol _inflateInit2_
    2>libOxygine-vc120-mt-gd.lib(png.obj) : error LNK2001: unresolved external symbol _adler32
    2>libOxygine-vc120-mt-gd.lib(png.obj) : error LNK2001: unresolved external symbol _inflateReset
    2>libOxygine-vc120-mt-gd.lib(pngrutil.obj) : error LNK2001: unresolved external symbol _inflateInit_
    2>libOxygine-vc120-mt-gd.lib(pngwrite.obj) : error LNK2001: unresolved external symbol _deflateEnd
    2>libOxygine-vc120-mt-gd.lib(pngwutil.obj) : error LNK2001: unresolved external symbol _deflateReset
    2>libOxygine-vc120-mt-gd.lib(pngwutil.obj) : error LNK2001: unresolved external symbol _deflateInit2_
    2>libOxygine-vc120-mt-gd.lib(pngwutil.obj) : error LNK2001: unresolved external symbol _deflate

Кажется, возникла проблема с поиском zlib, но он был связан с libpng, который, в свою очередь, был связан с игровой библиотекой libOxygine.

Само мое приложение не зависит напрямую как от zlib, так и от libpng, поэтому я действительно не хочу связывать их напрямую из моего приложения, так как обо всем этом следует позаботиться в моей библиотеке игрового движка libOxygine.

Спасибо


person codetemplar    schedule 11.06.2016    source источник


Ответы (2)


Если вы использовали проект .vcxproj из пакета zlib, он содержит некоторые ошибки. вот инструкция по их исправлению (я использовал zlibvc, а не zlibstat): http://www.tannerhelland.com/5076/compile-zlib-winapi-wapi-stdcall/

Чтобы исправить проблему неразрешенных символов, откройте настройки проекта zlib, затем перейдите в Свойства конфигурации -> C / C ++ -> Препроцессор и в строке определений препроцессора удалите «ZLIB_WINAPI;» (не забудьте удалить точку с запятой в конце).

person daniel.bavrin    schedule 06.07.2016

libpng зависит от zlib, поэтому вы должны сначала связать libpng, а затем zlib. Из ваших сообщений об ошибках видно, что они поменяны местами. Например, если вы используете gcc для сборки и компоновки, вам нужно указать «-lpng -lz» в командной строке, а не «-lz ... -lpng».

person Glenn Randers-Pehrson    schedule 19.06.2016