Развертывание приложения OpenCV c ++ с внешними библиотеками - PullRequest
5 голосов
/ 12 октября 2010

Я попытался найти много для этого без удачи (возможно, потому что я не использую правильные технические термины).Моя проблема в основном связана со связыванием статических библиотек, компиляцией и развертыванием.Прежде чем я углублюсь в детали, мои исполняемые файлы нормально компилируются в моей системе;главная проблема заключается в том, как развернуть их в качестве рабочего решения для других.

Я написал базовый exe для обработки изображений на c ++, который использует статические библиотеки OpenCV (я связываю их в VC ++, используя Project> Properties> Linker> добавьте дополнительные зависимости, как стандарт).Я компилирую, указывая на правильные включаемые файлы, устанавливая параметры VC ++ ... в принципе, все это прекрасно компилируется.Теперь я хочу иметь возможность развернуть это на другом ПК.Я так понимаю, мне понадобится релизная версия exe + static libs ... есть еще что-нибудь?

Некоторые библиотеки используют libjpeg и libpng;Я не думаю, что они включены в стандарт.Кроме того, я установил относительный путь компоновщика к статическим библиотекам (например, ресурсы / библиотеки), чтобы он не зависел от системы, поэтому он знает, где найти библиотеки.Основные структуры данных OpenCV работают нормально (например, CvPoint), но когда я пытаюсь загрузить изображение с помощью CvLoadImage, приложение вылетает.Если я вместо этого использую стандартный ifstream fopen, я могу открыть файл без проблем (но, похоже, не могу получить его в стойке с изображениями IplImage OpenCV - кто-нибудь знает, как это сделать? Вероятно, делать с IplImage-> imageData.),

Любая помощь очень ценится.Спасибо!

1 Ответ

1 голос
/ 13 октября 2010

Статические библиотеки не должны (и не должны) распространяться вместе с приложением. Статические библиотеки встроены в exe-файл компоновщиком.

Причина сбоя OpenCV заключается в том, что он не может найти DLL-библиотеки libpng / libjpeg. OpenCV не связывает их как статические зависимости, но вместо этого использует API-интерфейсы LoadLibrary / dlopen во время выполнения. Если эти вызовы не удаются, вероятно, нет хорошего восстановления, и приложение вылетает. Ваши проблемы должны быть исправлены, если вы включите библиотеки libpng / libjpeg.

Также будьте осторожны - некоторые .lib-файлы не являются статическими библиотеками, а представляют собой лишь тонкий слой, который позволяет компоновщику находить соответствующие функции в DLL и генерировать код динамической компоновки, чтобы программисту не приходилось делать это вручную , Обычно вы увидите, что из размера файла .lib, который довольно мал, и что ваше приложение плачет, что оно не может найти точку входа DLL при запуске exe.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...