2017-08-05 688 views
12

我試圖編譯OpenCV 3.3新版本(發佈於2017年8月3日),但我得到的C++11編譯OpenCV的3.3:C++ 11不支持

錯誤這是我cmake命令行:

cmake -D CMAKE_BUILD_TYPE=RELEASE \ 
-D CMAKE_INSTALL_PREFIX=/usr/local \  
-D WITH_CUDA=ON \  
-D ENABLE_FAST_MATH=1 \  
-D CUDA_FAST_MATH=1 \  
-D WITH_CUBLAS=1 \  
-DINSTALL_C_EXAMPLES=OFF \  
-D INSTALL_PYTHON_EXAMPLES=ON \  
-D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib-3.3/modules \  
-D BUILD_SHARED_LIBS=ON \  
-D WITH_GTK=ON/ 
-D BUILD_EXAMPLES=ON .. 

我已經通過接通一些組件編輯CMakeLists(即使不進行任何更改,誤差保持相同):

OCV_OPTION(WITH_OPENGL   "Include OpenGL support"      ON IF (NOT ANDROID AND NOT WINRT)) 
OCV_OPTION(WITH_OPENVX   "Include OpenVX support"      ON) 
OCV_OPTION(WITH_OPENNI   "Include OpenNI support"      ON IF (NOT ANDROID AND NOT IOS AND NOT WINRT)) 
OCV_OPTION(WITH_OPENNI2  "Include OpenNI2 support"      ON IF (NOT ANDROID AND NOT IOS AND NOT WINRT)) 
OCV_OPTION(WITH_OPENMP   "Include OpenMP support"      ON) 
OCV_OPTION(WITH_OPENCL_SVM  "Include OpenCL Shared Virtual Memory support" ON) # experimental 

在這裏,我CMakeError.log文件:

Compilation failed: 
    source file: '/home/jhros/opencv-3.3.0/cmake/checks/cxx11.cpp' 
    check option: '' 
===== BUILD LOG ===== 
Change Dir: /home/jhros/opencv-3.3.0/build/CMakeFiles/CMakeTmp 

Run Build Command:"/usr/bin/make" "cmTC_f915e/fast" 
/usr/bin/make -f CMakeFiles/cmTC_f915e.dir/build.make CMakeFiles/cmTC_f915e.dir/build 
make[1]: Entering directory '/home/jhros/opencv-3.3.0/build/CMakeFiles/CMakeTmp' 
Building CXX object CMakeFiles/cmTC_f915e.dir/cxx11.cpp.o 
/usr/bin/c++  -o CMakeFiles/cmTC_f915e.dir/cxx11.cpp.o -c /home/jhros/opencv-3.3.0/cmake/checks/cxx11.cpp 
/home/jhros/opencv-3.3.0/cmake/checks/cxx11.cpp:4:2: error: #error "C++11 is not supported" 
#error "C++11 is not supported" 
^
/home/jhros/opencv-3.3.0/cmake/checks/cxx11.cpp: In function ‘int main()’: 
/home/jhros/opencv-3.3.0/cmake/checks/cxx11.cpp:11:10: error: ‘res’ does not name a type 
    auto res = test(); 
     ^
/home/jhros/opencv-3.3.0/cmake/checks/cxx11.cpp:12:12: error: ‘res’ was not declared in this scope 
    return res; 
      ^
CMakeFiles/cmTC_f915e.dir/build.make:65: recipe for target 'CMakeFiles/cmTC_f915e.dir/cxx11.cpp.o' failed 
make[1]: *** [CMakeFiles/cmTC_f915e.dir/cxx11.cpp.o] Error 1 
make[1]: Leaving directory '/home/jhros/opencv-3.3.0/build/CMakeFiles/CMakeTmp' 
Makefile:126: recipe for target 'cmTC_f915e/fast' failed 
make: *** [cmTC_f915e/fast] Error 2 

而我CMakeLists(不是全部):

# ---------------------------------------------------------------------------- 
# Root CMake file for OpenCV 
# 
# From the off-tree build directory, invoke: 
#  $ cmake <PATH_TO_OPENCV_ROOT> 
# 
# ---------------------------------------------------------------------------- 

# Disable in-source builds to prevent source tree corruption. 
if(" ${CMAKE_SOURCE_DIR}" STREQUAL " ${CMAKE_BINARY_DIR}") 
    message(FATAL_ERROR " 
FATAL: In-source builds are not allowed. 
     You should create separate directory for build files. 
") 
endif() 


include(cmake/OpenCVMinDepVersions.cmake) 

if(CMAKE_GENERATOR MATCHES Xcode AND XCODE_VERSION VERSION_GREATER 4.3) 
    cmake_minimum_required(VERSION 3.0 FATAL_ERROR) 
elseif(CMAKE_SYSTEM_NAME MATCHES WindowsPhone OR CMAKE_SYSTEM_NAME MATCHES WindowsStore) 
    cmake_minimum_required(VERSION 3.1 FATAL_ERROR) 
    #Required to resolve linker error issues due to incompatibility with CMake v3.0+ policies. 
    #CMake fails to find _fseeko() which leads to subsequent linker error. 
    #See details here: http://www.cmake.org/Wiki/CMake/Policies 
    cmake_policy(VERSION 2.8) 
else() 
    cmake_minimum_required(VERSION "${MIN_VER_CMAKE}" FATAL_ERROR) 
endif() 

# Following block can broke build in case of cross-compilng 
# but CMAKE_CROSSCOMPILING variable will be set only on project(OpenCV) command 
# so we will try to detect crosscompiling by presense of CMAKE_TOOLCHAIN_FILE 
if(NOT DEFINED CMAKE_INSTALL_PREFIX) 
    if(NOT CMAKE_TOOLCHAIN_FILE) 
    # it _must_ go before project(OpenCV) in order to work 
    if(WIN32) 
     set(CMAKE_INSTALL_PREFIX "${CMAKE_BINARY_DIR}/install" CACHE PATH "Installation Directory") 
    else() 
     set(CMAKE_INSTALL_PREFIX "/usr/local" CACHE PATH "Installation Directory") 
    endif() 
    else(NOT CMAKE_TOOLCHAIN_FILE) 
    #Android: set output folder to ${CMAKE_BINARY_DIR} 
    set(LIBRARY_OUTPUT_PATH_ROOT ${CMAKE_BINARY_DIR} CACHE PATH "root for library output, set this to change where android libs are compiled to") 
    # any crosscompiling 
    set(CMAKE_INSTALL_PREFIX "${CMAKE_BINARY_DIR}/install" CACHE PATH "Installation Directory") 
    endif(NOT CMAKE_TOOLCHAIN_FILE) 
endif() 

if(CMAKE_SYSTEM_NAME MATCHES WindowsPhone OR CMAKE_SYSTEM_NAME MATCHES WindowsStore) 
    set(WINRT TRUE) 
endif(CMAKE_SYSTEM_NAME MATCHES WindowsPhone OR CMAKE_SYSTEM_NAME MATCHES WindowsStore) 

if(WINRT) 
    add_definitions(-DWINRT -DNO_GETENV) 

    # Making definitions available to other configurations and 
    # to filter dependency restrictions at compile time. 
    if(CMAKE_SYSTEM_NAME MATCHES WindowsPhone) 
    set(WINRT_PHONE TRUE) 
    add_definitions(-DWINRT_PHONE) 
    elseif(CMAKE_SYSTEM_NAME MATCHES WindowsStore) 
    set(WINRT_STORE TRUE) 
    add_definitions(-DWINRT_STORE) 
    endif() 

    if(CMAKE_SYSTEM_VERSION MATCHES 10) 
    set(WINRT_10 TRUE) 
    add_definitions(-DWINRT_10) 
    elseif(CMAKE_SYSTEM_VERSION MATCHES 8.1) 
    set(WINRT_8_1 TRUE) 
    add_definitions(-DWINRT_8_1) 
    elseif(CMAKE_SYSTEM_VERSION MATCHES 8.0) 
    set(WINRT_8_0 TRUE) 
    add_definitions(-DWINRT_8_0) 
    endif() 
endif() 

if(POLICY CMP0020) 
    cmake_policy(SET CMP0020 OLD) 
endif() 

if(POLICY CMP0022) 
    cmake_policy(SET CMP0022 OLD) 
endif() 

if(POLICY CMP0023) 
    cmake_policy(SET CMP0023 NEW) 
endif() 

if(POLICY CMP0026) 
    # silence cmake 3.0+ warnings about reading LOCATION attribute 
    cmake_policy(SET CMP0026 OLD) 
endif() 

if(POLICY CMP0042) 
    cmake_policy(SET CMP0042 NEW) 
endif() 

if(POLICY CMP0046) 
    cmake_policy(SET CMP0046 OLD) 
endif() 

if(POLICY CMP0051) 
    cmake_policy(SET CMP0051 NEW) 
endif() 

if(POLICY CMP0056) 
    cmake_policy(SET CMP0056 NEW) 
endif() 

if(POLICY CMP0067) 
    cmake_policy(SET CMP0067 NEW) 
endif() 

include(cmake/OpenCVUtils.cmake) 

# must go before the project command 
ocv_update(CMAKE_CONFIGURATION_TYPES "Debug;Release" CACHE STRING "Configs" FORCE) 
if(DEFINED CMAKE_BUILD_TYPE) 
    set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS ${CMAKE_CONFIGURATION_TYPES}) 
endif() 

enable_testing() 

project(OpenCV CXX C) 

if(MSVC) 
    set(CMAKE_USE_RELATIVE_PATHS ON CACHE INTERNAL "" FORCE) 
endif() 

ocv_cmake_eval(DEBUG_PRE ONCE) 

ocv_clear_vars(OpenCVModules_TARGETS) 

include(cmake/OpenCVDownload.cmake) 

# ---------------------------------------------------------------------------- 
# Break in case of popular CMake configuration mistakes 
# ---------------------------------------------------------------------------- 
if(NOT CMAKE_SIZEOF_VOID_P GREATER 0) 
    message(FATAL_ERROR "CMake fails to deterimine the bitness of target platform. 
    Please check your CMake and compiler installation. If you are crosscompiling then ensure that your CMake toolchain file correctly sets the compiler details.") 
endif() 

# ---------------------------------------------------------------------------- 
# Detect compiler and target platform architecture 
# ---------------------------------------------------------------------------- 
OCV_OPTION(ENABLE_CXX11 "Enable C++11 compilation mode" "${OPENCV_CXX11}") 
include(cmake/OpenCVDetectCXXCompiler.cmake) 

# Add these standard paths to the search paths for FIND_LIBRARY 
# to find libraries from these locations first 
if(UNIX AND NOT ANDROID) 
    if(X86_64 OR CMAKE_SIZEOF_VOID_P EQUAL 8) 
    if(EXISTS /lib64) 
     list(APPEND CMAKE_LIBRARY_PATH /lib64) 
    else() 
     list(APPEND CMAKE_LIBRARY_PATH /lib) 
    endif() 
    if(EXISTS /usr/lib64) 
     list(APPEND CMAKE_LIBRARY_PATH /usr/lib64) 
    else() 
     list(APPEND CMAKE_LIBRARY_PATH /usr/lib) 
    endif() 
    elseif(X86 OR CMAKE_SIZEOF_VOID_P EQUAL 4) 
    if(EXISTS /lib32) 
     list(APPEND CMAKE_LIBRARY_PATH /lib32) 
    else() 
     list(APPEND CMAKE_LIBRARY_PATH /lib) 
    endif() 
    if(EXISTS /usr/lib32) 
     list(APPEND CMAKE_LIBRARY_PATH /usr/lib32) 
    else() 
     list(APPEND CMAKE_LIBRARY_PATH /usr/lib) 
    endif() 
    endif() 
endif() 

# Add these standard paths to the search paths for FIND_PATH 
# to find include files from these locations first 
if(MINGW) 
    if(EXISTS /mingw) 
     list(APPEND CMAKE_INCLUDE_PATH /mingw) 
    endif() 
    if(EXISTS /mingw32) 
     list(APPEND CMAKE_INCLUDE_PATH /mingw32) 
    endif() 
    if(EXISTS /mingw64) 
     list(APPEND CMAKE_INCLUDE_PATH /mingw64) 
    endif() 
endif() 

編輯

CMake的版本-3.5

GNU編譯器5.4。 1

EDIT2

我與GNU編譯7.1.0現在,但我得到不同的錯誤

Build output check failed: 
    Regex: 'command line option .* is valid for .* but not for C\+\+' 
    Output line: 'cc1plus: warning: command line option ‘-Wmissing-prototypes’ is valid for C/ObjC but not for C++' 
Compilation failed: 
    source file: '/home/jhros/opencv-3.3.0/build/CMakeFiles/CMakeTmp/src.cxx' 
    check option: ' -fsigned-char -W -Wall -Werror=return-type -Werror=non-virtual-dtor -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wmissing-prototypes' 
+0

你是否對原來的OpenCV'CMakeLists.txt'做了一些修改? –

+1

@DanMašek是的,我打開了OCV_OPTION中的一些組件,我將在以後使用 –

+0

好的,你可以(不要粘貼這個相當長的文件塊)來總結這些變化,或者提供一個diff? |如果你添加'-DENABLE_CXX11 = OFF'給你的cmake命令行怎麼辦? –

回答

9

我終於從源碼編譯OpenCV 3.3成功,但我仍然不知道爲什麼它不會編譯以前。所有我所修改爲標誌OPENCV_EXTRA_MODULES_PATH到的opencv_contrib 3.3.0模塊的源文件,像這樣的參考:

$ cmake \ 
-D CMAKE_BUILD_TYPE=RELEASE \ 
-D CMAKE_INSTALL_PREFIX=/usr/local \ 
-D WITH_CUDA=ON \ 
-D ENABLE_FAST_MATH=1 \ 
-D CUDA_FAST_MATH=1 \ 
-D WITH_CUBLAS=1 \ 
-D INSTALL_C_EXAMPLES=OFF \ 
-D INSTALL_PYTHON_EXAMPLES=ON \ 
-D OPENCV_EXTRA_MODULES_PATH=/home/jhros/opencv-3.3.0/opencv_contrib-3.3.0/modules \ 
-D BUILD_SHARED_LIBS=ON \ 
-D WITH_GTK=ON \  
-D BUILD_EXAMPLES=ON .. 

我有一種警告(和許多其他)的無限數量:

warning: dynamic exception specifications are deprecated in C++11 

,你也可能會得到一個錯誤與不支持CUDA的GCC新版本:但是這

#error -- unsupported GNU version! gcc versions later than 5 are not supported! 

可以通過設置cmake使用的GCC舊版本在編譯OpenCV

CMAKE_C_COMPILER=/usr/bin/gcc-5 
+2

這個解決方案爲我工作。 「OPENCV_EXTRA_MODULES_PATH」的值存在拼寫錯誤。修復它到適當的值解決了C++ 11錯誤。 – exhuma

0

這裏的問題是不是你要使用C++ 11,但完全opposit中,源代碼依賴於它(根據給出的auto res = test();這是一個C++ 11功能的錯誤來判斷)。

對於GCC 5.4,默認的C++標準是帶有GNU擴展的C++ 98,如documentation所述,但您可以使用-std=c++11明確設置C++ 11標準(在GCC 5.4中幾乎完全支持)旗。這將可能解決問題,但更新到GCC 7.1(如馬克Setchell建議)是更好的主意和解決問題的框(7.1的默認標準是GNU擴展的C + + 14)。

至於如何傳遞的標誌:你只需要添加set(CMAKE_CXX_FLAGS "-std=c++11")到的CMakeLists.txt的開頭或添加的CMake GUI中的字符串條目,其中名稱是CMAKE_CXX_FLAGS和值-std=c++11

+0

我遇到了與@Ja_cpp相同的問題。不幸的是,這個解決方案並不適合我。 –

+0

現在我正在用GNU 7.1.0編譯,我得到了不同的錯誤! –

+1

我無法評論你的答案,所以我要繼續寫下我的。 '-Wmissing-prototypes'不是一個有效的C++標誌(雖然它適用於C),所以我絕對不知道它爲什麼被使用,也許CMake沒有找到正確的編譯器。至於警告;他們在編譯OpenCV時期待(至少它們是我的經驗),但是那些與C++ 11相關的_might_會使用'-DENABLE_CXX11 = ON'標誌消失。 – user2986898

1

我在Linux Mint的18.2 OpenCV的安裝3.3.1得到解決,接下來這篇文章(https://www.learnopencv.com/install-opencv3-on-ubuntu/)和我有同樣的問題。我從

cmake -D CMAKE_BUILD_TYPE=RELEASE \ 
    -D CMAKE_INSTALL_PREFIX=/usr/local \ 
    -D INSTALL_C_EXAMPLES=ON \ 
    -D INSTALL_PYTHON_EXAMPLES=ON \ 
    -D WITH_TBB=ON \ 
    -D WITH_V4L=ON \ 
    -D WITH_QT=ON \ 
    -D WITH_OPENGL=ON \ 
    -D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib/modules \ 
    -D BUILD_EXAMPLES=ON .. 

改變cmake的命令

cmake -D CMAKE_BUILD_TYPE=RELEASE \ 
    -DCMAKE_INSTALL_PREFIX=/usr/local \ 
    -D INSTALL_C_EXAMPLES=OFF \ 
    -D INSTALL_PYTHON_EXAMPLES=OFF \ 
    -D WITH_TBB=ON \ 
    -D WITH_V4L=ON \ 
    -D WITH_QT=ON \ 
    -D WITH_OPENGL=ON \ 
    -D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib/modules \ 
    -D BUILD_EXAMPLES=OFF .. 

(改變從-D CMAKE_INSTALL_PREFIX=/usr/local \-DCMAKE_INSTALL_PREFIX=/usr/local \),它爲我工作。希望有用。 注意:3.3.0不起作用。 (對不起我的英文)