Дано:
Библиотека zlib. Приходит в проект уже собранная, в виде .lib в статике.
Библиотека libarchive. Приходит в проект в исходниках, собираем ее сами, в статике. Линкуется с zlib.
Библиотека libpng. Приходит в проект в исходниках, собираем ее сами, в статике. Линкуется с zlib.
Далее:
Проект собирает экзешник. Если он линкуется только с zlib и с libarchive, то вылазит ошибка
archive_static.lib(archive_read_support_format_7zip.obj) : error LNK2019: unresolved external symbol __imp_inflate referenced in function decompress
Я даже знаю как ее устранить — достаточно определить переменную ZLIB_WINAPI при сборке libarchive, чтобы проставились корректные calling conventions.
Однако, вместо этого, экзешнику достаточно слинковаться с libpng, и тогда проблема линковки исчезает! Экзешник корректно генерируется и работает.
Вопрос:
Какого?? Почему это работает?
Ведь zlib одна и та же. Почему добавление в линковку соседнего проекта с zlib внезапно решает проблему с линковкой, тогда как просто добавление zlib не помогает? Как соседний проект чудесным образом лечит неправильные calling conventions??
P.S. Происходит на MSVC2015 и cmake 2.30. Причем на более старых cmake собирается нормально, даже без выставления ZLIB_WINAPI.