Коллеги программисты написали чудесную штуку для распознавания лиц. Предполагается, что лица будут подтягиваться под некие картинки, которые будут в итоге похожи на те лица, что были на фотографии.
В процессе разработки, пока всё конпелялось на тачках разработчиков, всё было хорошо... более-менее. Но пришло время выводить результаты в тираж, на сервера, а это значит унификация окружения, это значит, что мы используем одну версию библиотек, и все библиотеки собраны с определёнными параметрами и флагами. Естественно, всё должно быть в итоге опакечено.
И тут началась самая интересная часть истории.
Выяснилось, что opencv в процессе сборки пытается выкачать какие-то блобы из интернетов, поэтому ей нужен cmake с поддержкой https, благо нам эти блобы были не нужны и удалось opencv отучить от этой привычки. Далее, opencv ломается если её подсунуть старую libtiff, хотя находит её подходящей для сборки. Следующая особенность - opencv в любом случае собирается с поддержкой libpng и libjpeg. Неважно есть devel-пакеты в системе или их нету, ну то есть в составе opencv есть свои версии этих библиотек. Причём opencv может в прочессе сборки найти либу, но не найти заголовки, при этом она напишет, что использует системную либу, а собирать будет свою либу и линковаться будет с ней.
Но opencv не единственная либа, которая в своих исходниках вендорит длугие библиотеки. Dlib - собственно, с помощью которой обычно и производят всяческие обучения, распознавания и проч содержит в своих исходниках свои версии libpng, libjpeg, zlib и некоторых других библиотек и очень лбит дёргать из них себе некоторые функции статически.
Почему это плохо? Ну вот мы собрали до кучи нашу программулину, запустили её натравили на базовые изображения и... тут программа говорит, что, мол, я-то собрана против libpng-1.6.8, а вы меня запускаете с libpng-1.2.49, и не прогружает ресурсы. В итоге мы убили целый день, пока не нашли, откуда оно цепляло эти функции. Причём, самое интересное, что если бинарь запускать выставляя переменную окружения LD_PRELOAD=/путь/до/системной/libpng, то оно не жаловалось и нормально работало.
Вобщем, фраза "О, сколько нам открытий чудных..." приобрела новый смысл.