2013-04-19 4 views
0

Я хочу создать исполняемый файл, который я могу переместить на другой компьютер, на котором не установлен OpenCV.Связывание статических библиотек OpenCV в Eclipse Windows

Как таковой, я пытаюсь статически связать все библиотеки, необходимые в исполняемом файле (Thats, что называется?). Программа компилируется просто отлично и работает на моем локальном компьютере, но когда я копирую ее на другой компьютер, она жалуется, что она не имеет DLL-файлов и не будет выполнена.

Я использую затмение Юнону с MinGW, как компилятор на окнах 7.

Мой прогресс до сих пор: я включил необходимые библиотеки из OpenCV \ сборки \ x86 \ MinGW \ Lib в MinGW C++ линкера -> библиотеки в свойствах проекта.

opencv_core244.dll 
opencv_highgui244.dll 
opencv_imgproc244.dll 

В исходной папке они называются:

libopencv_core244.dll.a 
libopencv_highgui244.dll.a 
libopencv_imgproc244.dll.a 

Я установил флаг линкера в MinGW C++ Linker -> разное для -static.

Я много искал ответы и пробовал несколько разных вещей, но я действительно в шоке от этого.

Как вы вынуждаете компилятор в eclipse (в этом случае MinGW) связывать библиотеки как статические библиотеки, а не как динамические библиотеки, как это, по-видимому, делает?

ответ

1

1) Если OpenCV был скомпилирован для использования в качестве DLL, то вы не можете связывать статически.

2) Помните, когда вы скомпилируете проект для вывода DLL, тогда у вас есть .lib-файл. Этот .lib-файл на самом деле не является статической библиотекой с кодом. Он используется компилятором, чтобы узнать имя DLL для определения класса/функции. Это потребует DLL во время выполнения.

3) Для статического связывания вам нужен файл .lib, который скомпилирован как статическая библиотека. В такой компиляции есть только один вывод, который является .lib-файлом. Этот .lib-файл можно использовать для статической привязки, а код из .lib-файла добавляется в ваше приложение.

4) Я только что скомпилировал один проект с VStudio, который является DLL, имеющим только одну функцию. Я получаю DLL и .lib в качестве вывода. Размер .lib равен 2kb.

5) Когда я компилирую тот же проект, что и статическая библиотека, тогда я получаю только один вывод, который является .lib-файлом. Его размер составляет 133kb.

+0

Я не совсем понимаю ваш ответ. Я вообще не компилировал OpenCV. Я использовал установочный файл с главной страницы, чтобы предварительно скомпоновать opencv. Какие файлы в папке OpenCv следует использовать для статического соединения? Я использую файлы из папки build/mingw/lib. – mpals

1

Это почти год с разъяснением/ответом, но надеюсь, что это может быть полезно для вас или для кого-либо еще, кто сталкивается с этой страницей с той же проблемой.

Хотя Прутвираж не ясно объяснил свой ответ, у него была правильная идея. По умолчанию в конфигурационном файле cmake установлен флаг «BUILD_SHARED_LIBRARY», равный true. Файлы .a, которые были созданы, просто перенаправлены в файлы dll и, по сути, бесполезны для статической ссылки в программе.

Самый простой способ - перестроить OpenCV с помощью cmake, но убедитесь, что флаг «BUILD_SHARED_LIBRARY» установлен в значение false. Он находится под подкатегорией Build в графическом интерфейсе cmake, если вы используете это.

Новые созданные файлы make должны создавать статические библиотеки только в папке lib и должны правильно связывать opencv статически в вашей программе. Надеюсь, поможет!

Смежные вопросы