konstantin_doncov
konstantin_doncov

Reputation: 2879

Compiling dlib on Windows

I try to use dlib in Qt project on Windows. After downloading I at once started to try build my Qt application, without building examples. I also downloaded static libraries libpng and libjpeg from GnuWin.

.pro file:

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

Code:

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 output:

png_loader.cpp:103: undefined reference to 'png_set_longjmp_fn'

png_loader.cpp:153: undefined reference to 'png_set_longjmp_fn'

save_png.cpp:20: undefined reference to 'png_set_longjmp_fn'

save_png.cpp:72: undefined reference to 'png_set_longjmp_fn'

I know that I need to use libpng 1.4, but I can't find this version in GnuWin, so I used the most relevant 1.2.

MSVC runtime exception:

exception thrown!

Unable to load image in file C:\Users\user\Downloads\test.jpg.

You must #define DLIB_JPEG_SUPPORT and link to libjpeg to read JPEG files.

Do this by following the instructions at http://dlib.net/compile.html.

Note that you must cause DLIB_JPEG_SUPPORT to be defined for your entire project.

So don't #define it in one file. Instead, add it to the C/C++->Preprocessor->Preprocessor Definitions

field in Visual Studio's Property Pages window so it takes effect for your entire application.

But I set -DDLIB_JPEG_SUPPORT in my .pro file, linked with jpeg and png and even downloaded in the working folder shared library jpeg.dll. How can I solve this probles or how can I use dlib in Qt on Windows?

UPD: Errors after 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:

.pro file:

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

MSVC 2015 64bit Release output:

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:

.pro file:

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

Code:

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;
}

Release output:

Exited with code 255

Upvotes: 1

Views: 7557

Answers (1)

Evgeniy
Evgeniy

Reputation: 2511

You have chosen the way of compiling by incliding all/source.cpp into your project. This is possible but I think not the best way how to use dlib. So if you want to use all/source.cpp in your project - please follow instructions from here: http://dlib.net/compile.html

Compiling on Windows Using Visual Studio

All you need to do is create an empty console project. Then add dlib/all/source.cpp to it and add the folder containing the dlib folder to the #include search path. Then you can compile any example program by adding it to your project.

Again, note that dlib will only be able to work with jpeg and png files if you link in libjpeg and libpng. In Visual Studio, the easiest way to do this is to add all the source files in the dlib/external folder into your project and also define the DLIB_PNG_SUPPORT and DLIB_JPEG_SUPPORT preprocessor directives. If you don't know how to configure Visual Studio then you should use CMake as shown above since it will take care of everything automatically.

And with adding dlib/external folder - you can remove libjpeg and libpng from your project.

But as I said - its not the best way how to compile dlib. Dlib is designed to be used with CMAKE and the best way is to build it with CMAKE. Why this way is better:

  1. no need to rebuild dlib every time your project changes
  2. possible use of CUDA code (not now - but a bit later when CUDA 8 and VS update 4 will be released)

Here the first step (after installing CMAKE) should be checking if Dlib works. According to Dlib's instructions best way is to build examples and run them (from dlib's folder):

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

When running cmake .. you can specify your compiler version, for example:

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

To build examples with Visual Studio 2015 x64

After testing examples its a good time to build Dlib and start using it in real projects. And yes, again build is done by CMAKE (from dlib folder):

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

The building process is little different from building examples:

  1. CMAKE_INSTALL_PREFIX=C:\Users\user\dlib - compiled dlib will be installed into C:\Users\user\dlib
  2. --target install means we are installing dlib

After the building process will be finished - you are free to use dlib.lib (static version of Dlib) from C:\Users\user\dlib\lib. If you will use CMAKE with your project - you will need to add -DCMAKE_PREFIX_PATH=c:\Users\user\dlib. But now you are trying to compile with Qt Creator (QMake). Here is your .pro file should look like (the minimal possible example):

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

This project will not compile and run in Debug mode build because we used --config Release in our building process. But Release mode will run very fast

Please note

  1. Visual Studio will need separate dlib installation for Release and Debug builds. And Debug build of Dlib will be extremely slow
  2. Adding /arch:AVX to compiler flags (MSVC) will make Dlib run much faster
  3. DNN module will not work under MSVC until Cuda 8 and MSVC 2015 update 4 will be released

Upvotes: 2

Related Questions