2017-08-08 75 views
6

我想用java(ximgproc)的額外模塊編譯opencv。在使用Cmake生成文件後,我嘗試使用cmd的「mingw32-make」命令來生成.jar和.dll,但是我得到了下面的錯誤。如何解決使用mingw32-make編譯opencv時'不命名類型'?

我按照本指南:https://zami0xzami.wordpress.com/2016/03/16/building-java-wrapper-for-opencv/

我該如何解決呢?

C:\Users\Jt1995\Desktop\opencv-master\modules\objdetect\src\detection_based_tracker.cpp:175:14: error: 'thread' in namespace 'std' does not name a type 
     std::thread second_workthread; 
       ^~~~~~ 
C:\Users\Jt1995\Desktop\opencv-master\modules\objdetect\src\detection_based_tracker.cpp:176:14: error: 'mutex' in namespace 'std' does not name a type 
     std::mutex mtx; 
       ^~~~~ 
C:\Users\Jt1995\Desktop\opencv-master\modules\objdetect\src\detection_based_tracker.cpp:177:14: error: 'condition_variable' in namespace 'std' does not name a type 
     std::condition_variable objectDetectorRun; 
       ^~~~~~~~~~~~~~~~~~ 
C:\Users\Jt1995\Desktop\opencv-master\modules\objdetect\src\detection_based_tracker.cpp:178:14: error: 'condition_variable' in namespace 'std' does not name a type 
     std::condition_variable objectDetectorThreadStartStop; 
       ^~~~~~~~~~~~~~~~~~ 
C:\Users\Jt1995\Desktop\opencv-master\modules\objdetect\src\detection_based_tracker.cpp: In member function 'void cv::DetectionBasedTracker::SeparateDetectionWork::setParameters(const cv::DetectionBasedTracker::Parameters&)': 
C:\Users\Jt1995\Desktop\opencv-master\modules\objdetect\src\detection_based_tracker.cpp:143:30: error: 'mutex' is not a member of 'std' 
      std::unique_lock<std::mutex> mtx_lock(mtx); 
           ^~~ 
C:\Users\Jt1995\Desktop\opencv-master\modules\objdetect\src\detection_based_tracker.cpp:143:30: error: 'mutex' is not a member of 'std' 
C:\Users\Jt1995\Desktop\opencv-master\modules\objdetect\src\detection_based_tracker.cpp:143:40: error: template argument 1 is invalid 
      std::unique_lock<std::mutex> mtx_lock(mtx); 
             ^
C:\Users\Jt1995\Desktop\opencv-master\modules\objdetect\src\detection_based_tracker.cpp:143:51: error: 'mtx' was not declared in this scope 
      std::unique_lock<std::mutex> mtx_lock(mtx); 
                ^~~ 
C:\Users\Jt1995\Desktop\opencv-master\modules\objdetect\src\detection_based_tracker.cpp:143:42: warning: unused variable 'mtx_lock' [-Wunused-variable] 
      std::unique_lock<std::mutex> mtx_lock(mtx); 
              ^~~~~~~~ 
C:\Users\Jt1995\Desktop\opencv-master\modules\objdetect\src\detection_based_tracker.cpp: In member function 'void cv::DetectionBasedTracker::SeparateDetectionWork::init()': 
C:\Users\Jt1995\Desktop\opencv-master\modules\objdetect\src\detection_based_tracker.cpp:156:30: error: 'mutex' is not a member of 'std' 
      std::unique_lock<std::mutex> mtx_lock(mtx); 
           ^~~ 
C:\Users\Jt1995\Desktop\opencv-master\modules\objdetect\src\detection_based_tracker.cpp:156:30: error: 'mutex' is not a member of 'std' 
C:\Users\Jt1995\Desktop\opencv-master\modules\objdetect\src\detection_based_tracker.cpp:156:40: error: template argument 1 is invalid 
      std::unique_lock<std::mutex> mtx_lock(mtx); 
             ^
C:\Users\Jt1995\Desktop\opencv-master\modules\objdetect\src\detection_based_tracker.cpp:156:51: error: 'mtx' was not declared in this scope 
      std::unique_lock<std::mutex> mtx_lock(mtx); 
                ^~~ 
C:\Users\Jt1995\Desktop\opencv-master\modules\objdetect\src\detection_based_tracker.cpp:164:13: error: 'objectDetectorThreadStartStop' was not declared in this scope 
      objectDetectorThreadStartStop.notify_one(); 
      ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
C:\Users\Jt1995\Desktop\opencv-master\modules\objdetect\src\detection_based_tracker.cpp:156:42: warning: unused variable 'mtx_lock' [-Wunused-variable] 
      std::unique_lock<std::mutex> mtx_lock(mtx); 
              ^~~~~~~~ 
C:\Users\Jt1995\Desktop\opencv-master\modules\objdetect\src\detection_based_tracker.cpp: In destructor 'virtual cv::DetectionBasedTracker::SeparateDetectionWork::~SeparateDetectionWork()': 
C:\Users\Jt1995\Desktop\opencv-master\modules\objdetect\src\detection_based_tracker.cpp:254:5: error: 'second_workthread' was not declared in this scope 
    second_workthread.join(); 
    ^~~~~~~~~~~~~~~~~ 
C:\Users\Jt1995\Desktop\opencv-master\modules\objdetect\src\detection_based_tracker.cpp: In member function 'bool cv::DetectionBasedTracker::SeparateDetectionWork::run()': 
C:\Users\Jt1995\Desktop\opencv-master\modules\objdetect\src\detection_based_tracker.cpp:261:22: error: 'mutex' is not a member of 'std' 
    std::unique_lock<std::mutex> mtx_lock(mtx); 
         ^~~ 
C:\Users\Jt1995\Desktop\opencv-master\modules\objdetect\src\detection_based_tracker.cpp:261:22: error: 'mutex' is not a member of 'std' 
C:\Users\Jt1995\Desktop\opencv-master\modules\objdetect\src\detection_based_tracker.cpp:261:32: error: template argument 1 is invalid 
    std::unique_lock<std::mutex> mtx_lock(mtx); 
           ^
C:\Users\Jt1995\Desktop\opencv-master\modules\objdetect\src\detection_based_tracker.cpp:261:43: error: 'mtx' was not declared in this scope 
    std::unique_lock<std::mutex> mtx_lock(mtx); 
              ^~~ 
C:\Users\Jt1995\Desktop\opencv-master\modules\objdetect\src\detection_based_tracker.cpp:275:5: error: 'second_workthread' was not declared in this scope 
    second_workthread = std::thread(workcycleObjectDetectorFunction, (void*)this); //TODO: add attributes? 
    ^~~~~~~~~~~~~~~~~ 
C:\Users\Jt1995\Desktop\opencv-master\modules\objdetect\src\detection_based_tracker.cpp:275:25: error: 'thread' is not a member of 'std' 
    second_workthread = std::thread(workcycleObjectDetectorFunction, (void*)this); //TODO: add attributes? 
         ^~~ 
C:\Users\Jt1995\Desktop\opencv-master\modules\objdetect\src\detection_based_tracker.cpp:276:5: error: 'objectDetectorThreadStartStop' was not declared in this scope 
    objectDetectorThreadStartStop.wait(mtx_lock); 
    ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
C:\Users\Jt1995\Desktop\opencv-master\modules\objdetect\src\detection_based_tracker.cpp: In member function 'void cv::DetectionBasedTracker::SeparateDetectionWork::workcycleObjectDetector()': 
C:\Users\Jt1995\Desktop\opencv-master\modules\objdetect\src\detection_based_tracker.cpp:317:22: error: 'mutex' is not a member of 'std' 
    std::unique_lock<std::mutex> mtx_lock(mtx); 
         ^~~ 
C:\Users\Jt1995\Desktop\opencv-master\modules\objdetect\src\detection_based_tracker.cpp:317:22: error: 'mutex' is not a member of 'std' 
C:\Users\Jt1995\Desktop\opencv-master\modules\objdetect\src\detection_based_tracker.cpp:317:32: error: template argument 1 is invalid 
    std::unique_lock<std::mutex> mtx_lock(mtx); 
           ^
C:\Users\Jt1995\Desktop\opencv-master\modules\objdetect\src\detection_based_tracker.cpp:317:43: error: 'mtx' was not declared in this scope 
    std::unique_lock<std::mutex> mtx_lock(mtx); 
              ^~~ 
C:\Users\Jt1995\Desktop\opencv-master\modules\objdetect\src\detection_based_tracker.cpp:323:9: error: 'objectDetectorThreadStartStop' was not declared in this scope 
     objectDetectorThreadStartStop.notify_one(); 
     ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
C:\Users\Jt1995\Desktop\opencv-master\modules\objdetect\src\detection_based_tracker.cpp:330:9: error: 'objectDetectorRun' was not declared in this scope 
     objectDetectorRun.wait(mtx_lock); 
     ^~~~~~~~~~~~~~~~~ 
C:\Users\Jt1995\Desktop\opencv-master\modules\objdetect\src\detection_based_tracker.cpp:340:14: error: request for member 'unlock' in 'mtx_lock', which is of non-class type 'int' 
    mtx_lock.unlock(); 
       ^~~~~~ 
C:\Users\Jt1995\Desktop\opencv-master\modules\objdetect\src\detection_based_tracker.cpp:357:22: error: request for member 'lock' in 'mtx_lock', which is of non-class type 'int' 
      mtx_lock.lock(); 
         ^~~~ 
C:\Users\Jt1995\Desktop\opencv-master\modules\objdetect\src\detection_based_tracker.cpp:364:26: error: request for member 'unlock' in 'mtx_lock', which is of non-class type 'int' 
       mtx_lock.unlock(); 
          ^~~~~~ 
C:\Users\Jt1995\Desktop\opencv-master\modules\objdetect\src\detection_based_tracker.cpp:372:13: error: 'objectDetectorRun' was not declared in this scope 
      objectDetectorRun.wait(mtx_lock); 
      ^~~~~~~~~~~~~~~~~ 
C:\Users\Jt1995\Desktop\opencv-master\modules\objdetect\src\detection_based_tracker.cpp:380:22: error: request for member 'unlock' in 'mtx_lock', which is of non-class type 'int' 
      mtx_lock.unlock(); 
         ^~~~~~ 
C:\Users\Jt1995\Desktop\opencv-master\modules\objdetect\src\detection_based_tracker.cpp:431:18: error: request for member 'lock' in 'mtx_lock', which is of non-class type 'int' 
     mtx_lock.lock(); 
        ^~~~ 
C:\Users\Jt1995\Desktop\opencv-master\modules\objdetect\src\detection_based_tracker.cpp:447:18: error: request for member 'unlock' in 'mtx_lock', which is of non-class type 'int' 
     mtx_lock.unlock(); 
        ^~~~~~ 
C:\Users\Jt1995\Desktop\opencv-master\modules\objdetect\src\detection_based_tracker.cpp: In member function 'void cv::DetectionBasedTracker::SeparateDetectionWork::stop()': 
C:\Users\Jt1995\Desktop\opencv-master\modules\objdetect\src\detection_based_tracker.cpp:462:20: error: 'mutex' is not a member of 'std' 
    std::unique_lock<std::mutex> mtx_lock(mtx); 
        ^~~ 
C:\Users\Jt1995\Desktop\opencv-master\modules\objdetect\src\detection_based_tracker.cpp:462:20: error: 'mutex' is not a member of 'std' 
C:\Users\Jt1995\Desktop\opencv-master\modules\objdetect\src\detection_based_tracker.cpp:462:30: error: template argument 1 is invalid 
    std::unique_lock<std::mutex> mtx_lock(mtx); 
          ^
C:\Users\Jt1995\Desktop\opencv-master\modules\objdetect\src\detection_based_tracker.cpp:462:41: error: 'mtx' was not declared in this scope 
    std::unique_lock<std::mutex> mtx_lock(mtx); 
             ^~~ 
C:\Users\Jt1995\Desktop\opencv-master\modules\objdetect\src\detection_based_tracker.cpp:468:18: error: request for member 'unlock' in 'mtx_lock', which is of non-class type 'int' 
     mtx_lock.unlock(); 
        ^~~~~~ 
C:\Users\Jt1995\Desktop\opencv-master\modules\objdetect\src\detection_based_tracker.cpp:479:5: error: 'objectDetectorRun' was not declared in this scope 
    objectDetectorRun.notify_one(); 
    ^~~~~~~~~~~~~~~~~ 
C:\Users\Jt1995\Desktop\opencv-master\modules\objdetect\src\detection_based_tracker.cpp:480:5: error: 'objectDetectorThreadStartStop' was not declared in this scope 
    objectDetectorThreadStartStop.wait(mtx_lock); 
    ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
C:\Users\Jt1995\Desktop\opencv-master\modules\objdetect\src\detection_based_tracker.cpp:482:14: error: request for member 'unlock' in 'mtx_lock', which is of non-class type 'int' 
    mtx_lock.unlock(); 
       ^~~~~~ 
C:\Users\Jt1995\Desktop\opencv-master\modules\objdetect\src\detection_based_tracker.cpp: In member function 'void cv::DetectionBasedTracker::SeparateDetectionWork::resetTracking()': 
C:\Users\Jt1995\Desktop\opencv-master\modules\objdetect\src\detection_based_tracker.cpp:495:22: error: 'mutex' is not a member of 'std' 
    std::unique_lock<std::mutex> mtx_lock(mtx); 
         ^~~ 
C:\Users\Jt1995\Desktop\opencv-master\modules\objdetect\src\detection_based_tracker.cpp:495:22: error: 'mutex' is not a member of 'std' 
C:\Users\Jt1995\Desktop\opencv-master\modules\objdetect\src\detection_based_tracker.cpp:495:32: error: template argument 1 is invalid 
    std::unique_lock<std::mutex> mtx_lock(mtx); 
           ^
C:\Users\Jt1995\Desktop\opencv-master\modules\objdetect\src\detection_based_tracker.cpp:495:43: error: 'mtx' was not declared in this scope 
    std::unique_lock<std::mutex> mtx_lock(mtx); 
              ^~~ 
C:\Users\Jt1995\Desktop\opencv-master\modules\objdetect\src\detection_based_tracker.cpp:512:14: error: request for member 'unlock' in 'mtx_lock', which is of non-class type 'int' 
    mtx_lock.unlock(); 
       ^~~~~~ 
C:\Users\Jt1995\Desktop\opencv-master\modules\objdetect\src\detection_based_tracker.cpp: In member function 'bool cv::DetectionBasedTracker::SeparateDetectionWork::communicateWithDetectingThread(const cv::Mat&, std::vector<cv::Rect_<int> >&)': 
C:\Users\Jt1995\Desktop\opencv-master\modules\objdetect\src\detection_based_tracker.cpp:533:22: error: 'mutex' is not a member of 'std' 
    std::unique_lock<std::mutex> mtx_lock(mtx); 
         ^~~ 
C:\Users\Jt1995\Desktop\opencv-master\modules\objdetect\src\detection_based_tracker.cpp:533:22: error: 'mutex' is not a member of 'std' 
C:\Users\Jt1995\Desktop\opencv-master\modules\objdetect\src\detection_based_tracker.cpp:533:32: error: template argument 1 is invalid 
    std::unique_lock<std::mutex> mtx_lock(mtx); 
           ^
C:\Users\Jt1995\Desktop\opencv-master\modules\objdetect\src\detection_based_tracker.cpp:533:43: error: 'mtx' was not declared in this scope 
    std::unique_lock<std::mutex> mtx_lock(mtx); 
              ^~~ 
C:\Users\Jt1995\Desktop\opencv-master\modules\objdetect\src\detection_based_tracker.cpp:566:9: error: 'objectDetectorRun' was not declared in this scope 
     objectDetectorRun.notify_one(); 
     ^~~~~~~~~~~~~~~~~ 
C:\Users\Jt1995\Desktop\opencv-master\modules\objdetect\src\detection_based_tracker.cpp:573:14: error: request for member 'unlock' in 'mtx_lock', which is of non-class type 'int' 
    mtx_lock.unlock(); 
       ^~~~~~ 
modules\objdetect\CMakeFiles\opencv_objdetect.dir\build.make:121: recipe for target 'modules/objdetect/CMakeFiles/opencv_objdetect.dir/src/detection_based_tracker.cpp.obj' failed 
mingw32-make[2]: *** [modules/objdetect/CMakeFiles/opencv_objdetect.dir/src/detection_based_tracker.cpp.obj] Error 1 
CMakeFiles\Makefile2:3724: recipe for target 'modules/objdetect/CMakeFiles/opencv_objdetect.dir/all' failed 
mingw32-make[1]: *** [modules/objdetect/CMakeFiles/opencv_objdetect.dir/all] Error 2 
Makefile:161: recipe for target 'all' failed 
mingw32-make: *** [all] Error 2 
+1

[C++ mutex在命名空間中的可能重複std沒有命名一個類型](https://stackoverflow.com/questions/14191566/c-mutex-in-namespace-std-does-not-name-a-type) – Tsyvarev

+0

你弄明白了嗎?我也有。 – Oliv

+2

它不涉及'Java'和'Android',它是簡單的Windows''C++'... –

回答

5

這似乎是編譯器不知道C++ 11功能。您可以添加支持C++ 11這樣的:

set(MY_TARGET_NAME "MyTarget") 
target_compile_features(${MY_TARGET_NAME} PUBLIC cxx_std_11) 

還有cxx_std_14cxx_std_17你可以在需要時添加。

這裏是所有CXX的功能列表由CMake的已知:https://cmake.org/cmake/help/v3.10/prop_gbl/CMAKE_CXX_KNOWN_FEATURES.html#prop_gbl:CMAKE_CXX_KNOWN_FEATURES

+1

我鏈接的是CMake理解編譯器的功能,但編譯器本身可能會或可能不會使用它們,除非被請求。命令實際上設置了目標的COMPILE_FEATURES屬性或目標的INTERFACE_COMPILE_FEATURES屬性。有關更多詳細信息,請參閱target_compile_features命令文檔。 – RCYR

1

所使用的編譯器沒有配置C++ 11進行編譯。

如果激活它像在RCYR's answer是不可行的你,你可以開關C++ 11由選項ENABLE_CXX11設置爲OFF(如果在命令行上設置設有關閉在構建-DENABLE_CXX11=OFF

見的OpenCV的主要CMakeLists.txt

OCV_OPTION(ENABLE_CXX11 「啓用C++ 11彙編模式」, 「$ {OPENCV_CXX11}」)

相關問題