编译OpenCV的3.3:C++ 11不支持

问题描述:

我试图编译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命令行怎么办? –

我终于从源码编译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

这里的问题是不是你要使用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

我在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不起作用。 (对不起我的英文)