mercredi 25 juillet 2018

How to enable C++11 and get the emgucv compiled on my ubuntu 18.04?

First I am not familiar with make or cmake, but I have to compile the emgucv repository here https://github.com/emgucv/emgucv on ubuntu 18.04. I follow the instruction and try to figure out things by searching through stack exchange.

I got every dependencies setup, then the only file I need to execute is this one script (full command instructions at the end).

https://github.com/emgucv/emgucv/tree/master/platforms/ubuntu/16.04/cmake_configure.sh

Although it is written for 16.04, seems to work for 18.04, but the compilation throws an error. It says _MAX_DRIVE, _MAX_DIR, _MAX_PATH, DWORD, errno_t, etc. are not declared. I did my homework and found this is very likely because C++11 is not enabled. The error occurs in this file https://github.com/emgucv/tesseract/blob/1f977fcca53f37b579dcc0ad10a67994ca5320f1/src/ccutil/mainblk.cpp . And the module that contains this file is https://github.com/emgucv/tesseract/tree/1f977fcca53f37b579dcc0ad10a67994ca5320f1

My problem is, how to enable C++11 for this module or even the whole emgucv repository? How do I make changes to those cmake files? My attempt is presented later, but it does not work.

[ 74%] Building CXX object Emgu.CV.Extern/tesseract/libtesseract/CMakeFiles/tesseract_ccutil.dir/tesseract-ocr.git/src/ccutil/mainblk.cpp.o
/media/philips_cpm/data1/emgucv/Emgu.CV.Extern/tesseract/libtesseract/tesseract-ocr.git/src/ccutil/mainblk.cpp: In member function ‘void tesseract::CCUtil::main_setup(const char*, const char*)’:
/media/philips_cpm/data1/emgucv/Emgu.CV.Extern/tesseract/libtesseract/tesseract-ocr.git/src/ccutil/mainblk.cpp:77:16: error: ‘_MAX_DRIVE’ was not declared in this scope
     char drive[_MAX_DRIVE];
                ^~~~~~~~~~
/media/philips_cpm/data1/emgucv/Emgu.CV.Extern/tesseract/libtesseract/tesseract-ocr.git/src/ccutil/mainblk.cpp:78:14: error: ‘_MAX_DIR’ was not declared in this scope
     char dir[_MAX_DIR];
              ^~~~~~~~
/media/philips_cpm/data1/emgucv/Emgu.CV.Extern/tesseract/libtesseract/tesseract-ocr.git/src/ccutil/mainblk.cpp:79:15: error: ‘_MAX_PATH’ was not declared in this scope
     char path[_MAX_PATH];
               ^~~~~~~~~
/media/philips_cpm/data1/emgucv/Emgu.CV.Extern/tesseract/libtesseract/tesseract-ocr.git/src/ccutil/mainblk.cpp:83:5: error: ‘DWORD’ was not declared in this scope
     DWORD length = GetModuleFileName(nullptr, path, sizeof(path));
     ^~~~~
/media/philips_cpm/data1/emgucv/Emgu.CV.Extern/tesseract/libtesseract/tesseract-ocr.git/src/ccutil/mainblk.cpp:85:9: error: ‘length’ was not declared in this scope
     if (length > 0 && length < sizeof(path)) {
         ^~~~~~
/media/philips_cpm/data1/emgucv/Emgu.CV.Extern/tesseract/libtesseract/tesseract-ocr.git/src/ccutil/mainblk.cpp:85:39: error: ‘path’ was not declared in this scope
     if (length > 0 && length < sizeof(path)) {
                                       ^~~~
/media/philips_cpm/data1/emgucv/Emgu.CV.Extern/tesseract/libtesseract/tesseract-ocr.git/src/ccutil/mainblk.cpp:86:7: error: ‘errno_t’ was not declared in this scope
       errno_t result = _splitpath_s(path, drive, sizeof(drive),
       ^~~~~~~
/media/philips_cpm/data1/emgucv/Emgu.CV.Extern/tesseract/libtesseract/tesseract-ocr.git/src/ccutil/mainblk.cpp:88:11: error: ‘result’ was not declared in this scope
       if (result == ERANGE) {
           ^~~~~~
/media/philips_cpm/data1/emgucv/Emgu.CV.Extern/tesseract/libtesseract/tesseract-ocr.git/src/ccutil/mainblk.cpp:92:17: error: ‘drive’ was not declared in this scope
       datadir = drive;
                 ^~~~~
/media/philips_cpm/data1/emgucv/Emgu.CV.Extern/tesseract/libtesseract/tesseract-ocr.git/src/ccutil/mainblk.cpp:93:18: error: ‘dir’ was not declared in this scope
       datadir += dir;
                  ^~~
Emgu.CV.Extern/tesseract/libtesseract/CMakeFiles/tesseract_ccutil.dir/build.make:302: recipe for target 'Emgu.CV.Extern/tesseract/libtesseract/CMakeFiles/tesseract_ccutil.dir/tesseract-ocr.git/src/ccutil/mainblk.cpp.o' failed
make[2]: *** [Emgu.CV.Extern/tesseract/libtesseract/CMakeFiles/tesseract_ccutil.dir/tesseract-ocr.git/src/ccutil/mainblk.cpp.o] Error 1
CMakeFiles/Makefile2:5929: recipe for target 'Emgu.CV.Extern/tesseract/libtesseract/CMakeFiles/tesseract_ccutil.dir/all' failed
make[1]: *** [Emgu.CV.Extern/tesseract/libtesseract/CMakeFiles/tesseract_ccutil.dir/all] Error 2
Makefile:162: recipe for target 'all' failed
make: *** [all] Error 2

My attempt:

according to How to activate C++ 11 in CMake?, I put following in the Configure.cmake file in this folder https://github.com/emgucv/tesseract/tree/1f977fcca53f37b579dcc0ad10a67994ca5320f1/cmake

include(CheckCXXCompilerFlag)
CHECK_CXX_COMPILER_FLAG("-std=c++11" COMPILER_SUPPORTS_CXX11)
CHECK_CXX_COMPILER_FLAG("-std=c++0x" COMPILER_SUPPORTS_CXX0X)
if(COMPILER_SUPPORTS_CXX11)
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
elseif(COMPILER_SUPPORTS_CXX0X)
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x")
else()
        message(STATUS "The compiler ${CMAKE_CXX_COMPILER} has no C++11 support. Please use a different C++ compiler.")
endif()

enter image description here but it does not work. I am not familiar with this, am I doing wrong?

Emgucv compile manual for ubuntu: http://www.emgu.com/wiki/index.php/Download_And_Installation#Ubuntu_16.04 The commands are summarized below

git clone https://github.com/emgucv/emgucv emgucv

cd emgucv

git submodule update --init --recursive

cd platforms/ubuntu/16.04

./apt_install_dependency.sh

./cmake_configure.sh

Aucun commentaire:

Enregistrer un commentaire