Как встроить openCV Dll в исполняемый файл - PullRequest
3 голосов
/ 05 июля 2011

Я написал инструмент для сопоставления изображений (консольное приложение, без графического интерфейса или Windows), используя openCV. Я хочу перенести мой EXE-файл на другой компьютер, но он запрашивает opencv dll (opencv_core220.dll, opencv_highgui220.dll, ...)

Мой вопрос: как это сделать? Я вижу два пути, каждый из которых хорош:

  1. Перекомпилируйте opencv как статическую библиотеку (.lib вместо .dll). Это не сработало. Я получаю 10 ошибок компоновщика относительно cap_vfw.obj
  2. Если возможно, как объединить / внедрить DLL в exe-файл.

Я пытался использовать ILMerge , но он не работает (ошибка: не удалось загрузить сборку из файла a.exe), поскольку он предназначен только для .Net

P.S. - Я использую Visual Studio 2005, на Windows, C ++ компилятор, OpenCV 2.2

Ответы [ 3 ]

7 голосов
/ 05 июля 2011

Я нашел ответ.Вы должны открыть исходный проект openCV и перекомпилировать все соответствующие части в режиме статической библиотеки.

  • Делайте это для каждого проекта, начиная с libjasper и в алфавитном порядке до opencv_video.Также сделайте то же самое для zlib project
  • Для каждого проекта перейдите в свойства проекта \ свойства конфигурации \ general \ тип конфигурации и установите для него статическую библиотеку
  • Теперь перекомпилируйте эти проекты.Они создадут много больших файлов lib (до 10 МБ) каждый.Эти файлы находятся в основном в каталоге modules opencv.Вы должны найти их и скопировать в каталог, когда сохраняете свои обычные файлы lib при компиляции против DLL.Теперь это сложная часть
  • Вы должны включить в свой код больше библиотек, чем при компиляции с использованием
  • библиотеки DLL. Вот пример того, как ваш код должен выглядеть следующим образом.Извините, что он не отформатирован хорошо.Возможно html-ошибки этой страницы:
#include "cv.h"
#include "highgui.h"

    using namespace std;
    using namespace cv;

    // Directives to linker to include openCV lib files.

    #ifndef STATIC_LIBRARY_LINK
        // Linking against DLL. For each 'lib' file that appears below, final EXE will need a DLL.

    // Core of openCV
    #pragma comment(lib, "opencv_core220.lib") 
    #pragma comment(lib, "opencv_highgui220.lib") 
    #pragma comment(lib, "opencv_imgproc220.lib") 

    // Calibration and image matching
    #pragma comment(lib, "opencv_flann220.lib") 
    #pragma comment(lib, "opencv_features2d220.lib") 
    #pragma comment(lib, "opencv_calib3d220.lib") 

    // Other libs that might be needed
    /*#pragma comment(lib, "opencv_gpu220.lib") 
    #pragma comment(lib, "opencv_video220.lib") 
    #pragma comment(lib, "opencv_legacy220.lib") 

    #pragma comment(lib, "opencv_ml220.lib") 
    #pragma comment(lib, "opencv_objdetect220.lib") 
    #pragma comment(lib, "opencv_ffmpeg220.lib") 
    #pragma comment(lib, "opencv_contrib220.lib") */
#else

    // Static linking. No DLL's would be required but EXE file will be bigger 
    // and linking in debug mode might produce many warnings since *.pdb are not always 
    // present with the lib files

    // Core of openCV. Must be compiled as lib and not as dll's
    #pragma comment(lib, "opencv_core.lib") 
    #pragma comment(lib, "opencv_highgui.lib") 
    #pragma comment(lib, "opencv_imgproc.lib") 

    // Calibration and image matching. Must be compiled as lib and not as dll's
    #pragma comment(lib, "opencv_flann.lib") 
    #pragma comment(lib, "opencv_features2d.lib") 
    #pragma comment(lib, "opencv_calib3d.lib") 

    // Image I/O auxillary libraries. Must be compiled as lib and not as dll's
    #pragma comment(lib, "libtiff.lib") 
    #pragma comment(lib, "libpng.lib")
    #pragma comment(lib, "zlib.lib")
    #pragma comment(lib, "libjasper.lib")
    #pragma comment(lib, "libjpeg.lib")

    // OpenCV linear algebra methods. Must be compiled as lib and not as dll's
    #pragma comment(lib, "opencv_lapack.lib")

    // Auxillary libs, found in visual studio microsoft sdk
    #pragma comment(lib, "vfw32.lib")
    #pragma comment( lib, "comctl32.lib" )
    //#pragma comment(lib, "window_w32.lib")  // Not needed
#endif


    int main(void){
        // Your code here
        return 0;
    }
2 голосов
/ 05 июля 2011

Вы ищете термин статическое связывание .«DLL» означает «Динамически связанная библиотека», которая является противоположностью статической.Вы не можете статически связать динамически связанную библиотеку.Для этого вам нужна «нормальная» библиотека.

0 голосов
/ 16 августа 2013

Перейдите в свойства для проекта, который вы строите (щелкните правой кнопкой мыши по проекту в обозревателе решений и выберите свойства). Теперь разверните опцию Configuration properties-> Linker и в разделе General задайте путь к статически связанным библиотекам (т. Е. С расширениями .lib). Теперь выберите «Свойства конфигурации» -> «Линкер» -> «Ввод» и введите имена всех библиотек, на которые вы хотите статически связать. Теперь пересоберите проект, и он должен быть связан с исполняемым файлом. Он предупредит вас, если пути к файлам не верны.

...