Компиляция dlib в Windows

Я пытаюсь использовать dlib в проекте Qt в Windows. После скачивания я сразу начал пытаться собрать свое Qt-приложение, не собирая примеров. Я также скачал статические библиотеки libpng и libjpeg из GnuWin.

Файл .pro:

SOURCES += main.cpp\
        mainwindow.cpp \
    C:/Users/user/Downloads/dlib-19.0/dlib-19.0/dlib/all/source.cpp

HEADERS  += mainwindow.h

INCLUDEPATH += "C:\Users\user\Downloads\dlib-19.0\dlib-19.0"
LIBS += -L"C:\Users\user\Downloads\dlib-19.0\dlib-19.0"

INCLUDEPATH += "C:\Users\user\Downloads\dlib-19.0\dlib-19.0\dlib\external\libpng"
INCLUDEPATH += "C:\Users\user\Downloads\dlib-19.0\dlib-19.0\dlib\external\libjpeg"

LIBS += -L"C:\Users\user\Downloads\jpeg-6b-4-lib\lib" -ljpeg

LIBS += -L"C:\Users\user\Downloads\libpng-1.2.37-lib\lib" -lpng

LIBS += -lwinmm -lws2_32 -luser32 -lgdi32 -lcomctl32 -limm32

QMAKE_CXXFLAGS += -std=c++11 -DDLIB_PNG_SUPPORT -DDLIB_JPEG_SUPPORT

Код:

try
{
     array2d<rgb_pixel> img;
     load_image(img, "C:\\Users\\user\\Downloads\\test.jpg");
}
catch (exception& e)
{
    cout << "\nexception thrown!" << endl;
    cout << e.what() << endl;
}

Вывод MinGW:

png_loader.cpp:103: неопределенная ссылка на 'png_set_longjmp_fn'

png_loader.cpp:153: неопределенная ссылка на 'png_set_longjmp_fn'

save_png.cpp:20: неопределенная ссылка на 'png_set_longjmp_fn'

save_png.cpp:72: неопределенная ссылка на 'png_set_longjmp_fn'

Я знаю, что мне нужно использовать libpng 1.4, но я не могу найти эту версию в GnuWin, поэтому я использовал наиболее актуальную версию 1.2.

Исключение среды выполнения MSVC:

выброшено исключение!

Не удалось загрузить изображение в файл C:\Users\user\Downloads\test.jpg.

Вы должны #define DLIB_JPEG_SUPPORT и ссылку на libjpeg для чтения файлов JPEG.

Сделайте это, следуя инструкциям на странице http://dlib.net/compile.html.

Обратите внимание, что вы должны определить DLIB_JPEG_SUPPORT для всего вашего проекта.

Так что не #определяйте это в одном файле. Вместо этого добавьте его в C/C++->Preprocessor->Preprocessor Definitions.

в окне страниц свойств Visual Studio, чтобы оно действовало для всего приложения.

Но я поставил -DDLIB_JPEG_SUPPORT в свой .pro файл, слинковал с jpeg и png и даже скачал в рабочую папку общую библиотеку jpeg.dll. Как я могу решить эту проблему или как я могу использовать dlib в Qt в Windows?

UPD: Ошибки после E:\CMake\bin\cmake.exe --build . --config Release:

"C:\Users\user\Downloads\dlib-19.0\dlib-19.0\examples\build\ALL_BUILD.vcxproj" (default target) (1) ->
"C:\Users\user\Downloads\dlib-19.0\dlib-19.0\examples\build\3d_point_cloud_ex.vcxproj" (default target)
(3) ->
"C:\Users\user\Downloads\dlib-19.0\dlib-19.0\examples\build\dlib_build\dlib.vcxproj" (default target) (4
) ->
(target ClCompile) ->
  f:\gstreamer\1.0\x86\include\jmorecfg.h(211): error C2371: 'boolean': redefinition; different basic types [C:\Users\user
  \Downloads\dlib-19.0\dlib-19.0\examples\build\dlib_build\dlib.vcxproj]
  C:\Program Files (x86)\Windows Kits\8.1\Include\shared\basetsd.h(72): error C2371: 'INT32': redefinition; different b
asic types [C:\Users\user\Downloads\dlib-19.0\dlib-19.0\examples\build\dlib_build\dlib.vcxproj]
  c:\program files (x86)\windows kits\8.1\include\shared\rpcndr.h(178): error C2371: 'boolean': redefinition; different
 basic types [C:\Users\user\Downloads\dlib-19.0\dlib-19.0\examples\build\dlib_build\dlib.vcxproj]
  c:\program files (x86)\windows kits\8.1\include\shared\wtypesbase.h(493): error C2371: 'BOOLEAN': redefinition; diffe
rent basic types [C:\Users\user\Downloads\dlib-19.0\dlib-19.0\examples\build\dlib_build\dlib.vcxproj]

UPD2:

"C:\Users\user\Downloads\dlib-19.0\dlib-19.0\examples\build\ALL_BUILD.vcxproj" (default target) (1) ->
"C:\Users\user\Downloads\dlib-19.0\dlib-19.0\examples\build\3d_point_cloud_ex.vcxproj" (default target) (3) ->
"C:\Users\user\Downloads\dlib-19.0\dlib-19.0\examples\build\dlib_build\dlib.vcxproj" (default target) (4) ->
(target ClCompile) ->
  C:\Users\user\Downloads\dlib-19.0\dlib-19.0\dlib\image_loader\jpeg_loader.cpp(17): fatal error C1083: Cannot open include file: 'jpeglib.h': No such file or directory [C:\U
sers\user\Downloads\dlib-19.0\dlib-19.0\examples\build\dlib_build\dlib.vcxproj]
  C:\Users\user\Downloads\dlib-19.0\dlib-19.0\dlib\image_saver\save_jpeg.cpp(16): fatal error C1083: Cannot open include file: 'jpeglib.h': No such file or directory [C:\User
s\user\Downloads\dlib-19.0\dlib-19.0\examples\build\dlib_build\dlib.vcxproj]

UPD3:

.про файл:

INCLUDEPATH += "E:\dlib_build\include"
LIBS += -L"E:\dlib_build"
LIBS += -ldlib
QMAKE_CXXFLAGS_RELEASE += /arch:AVX
QMAKE_CXXFLAGS += -std=c++11 -DDLIB_PNG_SUPPORT -DDLIB_JPEG_SUPPORT

Вывод 64-битной версии MSVC 2015:

mainwindow.obj : error LNK2019: unresolved external symbol "public: __cdecl dlib::entropy_decoder_kernel_2::entropy_decoder_kernel_2(void)" (??0entrop...
mainwindow.obj : error LNK2019: unresolved external symbol "public: virtual __cdecl dlib::entropy_decoder_kernel_2::~entropy_decoder_kernel_2(void)" (...
mainwindow.obj : error LNK2019: unresolved external symbol "public: void __cdecl dlib::entropy_decoder_kernel_2::set_stream(class std::basic_istream<c...
mainwindow.obj : error LNK2019: unresolved external symbol "public: void __cdecl dlib::entropy_decoder_kernel_2::decode(unsigned int,unsigned int)" (?...
mainwindow.obj : error LNK2019: unresolved external symbol "public: unsigned int __cdecl dlib::entropy_decoder_kernel_2::get_target(unsigned int)" (?g...
mainwindow.obj : error LNK2019: unresolved external symbol "public: __cdecl dlib::png_loader::png_loader(class std::basic_string<char,struct std::char...
mainwindow.obj : error LNK2019: unresolved external symbol "public: __cdecl dlib::png_loader::~png_loader(void)" (??1png_loader@dlib@@QEAA@XZ) referen...
mainwindow.obj : error LNK2019: unresolved external symbol "public: bool __cdecl dlib::png_loader::is_gray(void)const " (?is_gray@png_loader@dlib@@QEB...
mainwindow.obj : error LNK2019: unresolved external symbol "public: bool __cdecl dlib::png_loader::is_graya(void)const " (?is_graya@png_loader@dlib@@Q...
mainwindow.obj : error LNK2019: unresolved external symbol "public: bool __cdecl dlib::png_loader::is_rgb(void)const " (?is_rgb@png_loader@dlib@@QEBA_...
mainwindow.obj : error LNK2019: unresolved external symbol "public: bool __cdecl dlib::png_loader::is_rgba(void)const " (?is_rgba@png_loader@dlib@@QEB...
mainwindow.obj : error LNK2019: unresolved external symbol "private: unsigned char const * __cdecl dlib::png_loader::get_row(unsigned int)const " (?ge...
mainwindow.obj : error LNK2019: unresolved external symbol "public: __cdecl dlib::jpeg_loader::jpeg_loader(class std::basic_string<char,struct std::ch...
mainwindow.obj : error LNK2019: unresolved external symbol "public: bool __cdecl dlib::jpeg_loader::is_gray(void)const " (?is_gray@jpeg_loader@dlib@@Q...
mainwindow.obj : error LNK2019: unresolved external symbol USER_ERROR__missing_dlib_all_source_cpp_file__OR__inconsistent_use_of_DEBUG_or_ENABLE_ASSER...
E:\dlib_build\lib\dlib.lib : warning LNK4272: library machine type 'X86' conflicts with target machine type 'x64'
release\dlibWindows.exe : fatal error LNK1120: 15 unresolved externals
jom: F:\Projects\QtProjects\build-dlibWindows-Desktop_Qt_5_6_0_MSVC2015_64bit-Release\Makefile.Release [release\dlibWindows.exe] Error 1120

UPD4:

.про файл:

INCLUDEPATH += "E:\dlib_build\include"
LIBS += -L"E:\dlib_build"
LIBS += -ldlib
QMAKE_CXXFLAGS_RELEASE += /arch:AVX

Код:

try
{
    //or even just one line "frontal_face_detector detector = get_frontal_face_detector();"
    array2d<rgb_pixel> img;
    load_image(img, "C:/Users/user/Downloads/test.jpg");
}
catch (exception& e)
{
    cout << "\nexception thrown!" << endl;
    cout << e.what() << endl;
}

Вывод релиза:

Вышел с кодом 255


person konstantin_doncov    schedule 01.07.2016    source источник


Ответы (1)


Вы выбрали способ компиляции, включив all/source.cpp в свой проект. Это возможно, но я думаю, что это не лучший способ использования dlib. Поэтому, если вы хотите использовать all/source.cpp в своем проекте, следуйте инструкциям здесь: http://dlib.net/compile.html

Компиляция в Windows с помощью Visual Studio

Все, что вам нужно сделать, это создать пустой консольный проект. Затем добавьте к нему dlib/all/source.cpp и добавьте папку, содержащую папку dlib, в путь поиска #include. Затем вы можете скомпилировать любую программу-пример, добавив ее в свой проект.

Опять же, обратите внимание, что dlib сможет работать с файлами jpeg и png, только если вы создадите ссылку в libjpeg и libpng. В Visual Studio самый простой способ сделать это — добавить все исходные файлы из папки dlib/external в свой проект, а также определить директивы препроцессора DLIB_PNG_SUPPORT и DLIB_JPEG_SUPPORT. Если вы не знаете, как настроить Visual Studio, вам следует использовать CMake, как показано выше, так как он позаботится обо всем автоматически.

А с добавлением папки dlib/external вы можете удалить libjpeg и libpng из своего проекта.

Но, как я уже сказал, это не лучший способ компилировать dlib. Dlib предназначен для использования с CMAKE, и лучший способ — собрать его с помощью CMAKE. Почему этот способ лучше:

  1. нет необходимости пересобирать dlib каждый раз, когда ваш проект изменяется
  2. возможно использование кода CUDA (не сейчас, а чуть позже, когда будут выпущены CUDA 8 и VS update 4)

Здесь первым шагом (после установки CMAKE) должна быть проверка работы Dlib. Согласно инструкциям Dlib, лучший способ - собрать примеры и запустить их (из папки dlib):

cd examples
mkdir build
cd build
cmake ..
cmake --build . --config Release

При запуске cmake .. вы можете указать версию своего компилятора, например:

cmake .. -G"Visual Studio 14 2015 Win64" 

Создание примеров с помощью Visual Studio 2015 x64

После тестирования примеров самое время собрать Dlib и начать использовать его в реальных проектах. И да, сборка снова выполняется CMAKE (из папки dlib):

mkdir build
cd build
cmake .. -G"Visual Studio 14 2015 Win64" -DCMAKE_INSTALL_PREFIX=C:\Users\user\dlib
cmake --build . --config Release --target install

Процесс сборки мало чем отличается от сборки примеров:

  1. CMAKE_INSTALL_PREFIX=C:\Users\user\dlib — скомпилированный dlib будет установлен в C:\Users\user\dlib
  2. --target install означает, что мы устанавливаем dlib

После завершения процесса сборки вы можете использовать dlib.lib (статическую версию Dlib) из C:\Users\user\dlib\lib. Если вы будете использовать CMAKE в своем проекте, вам нужно будет добавить -DCMAKE_PREFIX_PATH=c:\Users\user\dlib. Но теперь вы пытаетесь скомпилировать с помощью Qt Creator (QMake). Вот как должен выглядеть ваш файл .pro (минимально возможный пример):

SOURCES += face_detection_ex.cpp
INCLUDEPATH += "C:\Users\user\dlib\include"
LIBS += -L"C:\Users\user\dlib"
LIBS += -ldlib
QMAKE_CXXFLAGS_RELEASE += /arch:AVX

Этот проект не будет компилироваться и запускаться в режиме отладки, поскольку в процессе сборки мы использовали --config Release. Но режим Release будет работать очень быстро

Пожалуйста, обрати внимание

  1. Visual Studio потребуется отдельная установка dlib для выпускных и отладочных сборок. И отладочная сборка Dlib будет очень медленной
  2. Добавление /arch:AVX к флагам компилятора (MSVC) значительно ускорит работу Dlib.
  3. Модуль DNN не будет работать под MSVC, пока не будут выпущены Cuda 8 и MSVC 2015, обновление 4.
person Evgeniy    schedule 01.07.2016
comment
Еще раз спасибо за ваш ответ. Я решил использовать CMake, но получил ошибки при попытке скомпилировать примеры dlib, пожалуйста, проверьте раздел UPD в моем вопросе. - person konstantin_doncov; 01.07.2016
comment
Похоже, на вашем ПК установлено несколько несовместимых установок LibJPEG (f:\gstreamer\1.0\x86\include\jmorecfg.h(211): error C2371: 'boolean') - попробуйте временно скрыть (переименовать) эту папку при сборке Dlib - person Evgeniy; 01.07.2016
comment
Хорошо, но теперь я получаю другие ошибки, вы можете проверить это в UPD2 - person konstantin_doncov; 01.07.2016
comment
перезапустите cmake .. шаг - person Evgeniy; 01.07.2016
comment
Хороший! Теперь я собрал и установил dlib, но у меня возникают проблемы во время сборки выпуска моего приложения (которое я описал в UPD3), и я все еще получаю исключение You must #define DLIB_JPEG_SUPPORT and link to libjpeg... во время выполнения отладочной конфигурации. - person konstantin_doncov; 01.07.2016
comment
перезапустите cmake .. шаг с -GVisual Studio .... Win64 обратите внимание на ошибку: E:\dlib_build\lib\dlib.lib : предупреждение LNK4272: тип библиотечной машины «X86» конфликтует с типом целевой машины ' х64' - person Evgeniy; 01.07.2016
comment
Хорошо, я пересобрал примеры и переустановил dlib. После того, как код этого релиза вылетает с кодом 255 даже на простых функциях, таких как load_image или get_frontal_face_detector() (описано в UPD4), блок try-catch не может остановить сбой. Также конфигурация отладки выводит исключение You must #define DLIB_JPEG_SUPPORT and link to libjpeg.... - person konstantin_doncov; 02.07.2016
comment
... а также проверьте этот вопрос - person konstantin_doncov; 02.07.2016
comment
Давайте продолжим обсуждение в чате. - person Evgeniy; 02.07.2016
comment
Вы установили дополнительные библиотеки jpeg для dlib? Может проблема в окружении? - person konstantin_doncov; 03.07.2016
comment
нет. dlib имеет внутри libjpeg и libpng. что-то не так с включениями на вашем компьютере - person Evgeniy; 04.07.2016