我正在使用说明here和here在ubuntu中构建OpenWRT但是我得到:
make[4]: Entering directory '~/openwrt/build_dir/host/cmake-3.11.1/Bootstrap.cmk'
make[4]: 'cmake' is up to date.
make[4]: Leaving directory '~/openwrt/build_dir/host/cmake-3.11.1/Bootstrap.cmk'
loading initial cache file ~/openwrt/build_dir/host/cmake-3.11.1/Bootstrap.cmk/InitialCacheFlags.cmake
CMake Error at CMakeLists.txt:92 (message):
The C++ compiler does not support C++11 (e.g. std::unique_ptr).
-- Configuring incomplete, errors occurred!
这里有一个类似问题的解决方案,但是我不清楚哪个 CMakeLists.txt 文件是我的“根”。在 OpenWRT 论坛(或一般的搜索引擎)上没有看到太多关于此失败的信息。
我得到的印象是 CMake 安装是由 OpenWRT 构建器本身下载的,因为我没有安装 CMake 并且安装 cmake 没有解决任何问题。尝试查看最新的 OpenWRT v18.06.2。当构建失败时,我删除了克隆的目录并尝试了 v18.06.0-rc2。没有任何改善。
也试过
导出 CMAKE_CXX_STANDARD=11在运行“make”之前 ...它没有解决问题。
我的 g++ 安装状态:
$ g++ -v
Using built-in specs.
COLLECT_GCC=g++
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/7/lto-wrapper
OFFLOAD_TARGET_NAMES=nvptx-none
OFFLOAD_TARGET_DEFAULT=1
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 7.3.0-27ubuntu1~18.04' --with-bugurl=file:///usr/share/doc/gcc-7/README.Bugs --enable-languages=c,ada,c++,go,brig,d,fortran,objc,obj-c++ --prefix=/usr --with-gcc-major-version-only --program-suffix=-7 --program-prefix=x86_64-linux-gnu- --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-libmpx --enable-plugin --enable-default-pie --with-system-zlib --with-target-system-zlib --enable-objc-gc=auto --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-offload-targets=nvptx-none --without-cuda-driver --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 7.3.0 (Ubuntu 7.3.0-27ubuntu1~18.04)
好吧,那是 5 个小时我没主意了。这可能是开发端的配置错误或错误吗?
如果配置错误,可能设置错了什么?
在搜索了数百万页之后,人们只谈论为什么而不是如何,我的解决方案很简单:
将 cmake 源代码复制到我的系统驱动器。如果你在远程硬盘上制作 cmake 它将失败并像上面一样出错
export CXXFLAGS=O3
configure
... many lines ignored
checking whether g++ supports C++11 features by default... no
checking whether g++ supports C++11 features with -std=c++11... no
checking whether g++ supports C++11 features with +std=c++11... no
checking whether g++ supports C++11 features with -h std=c++11... no
checking whether g++ supports C++11 features with -std=c++0x... no
checking whether g++ supports C++11 features with +std=c++0x... no
checking whether g++ supports C++11 features with -h std=c++0x... no
configure: error: *** A compiler with support for C++11 language features is required.
注意:执行 export CXXFLAGS="-O3" 后,我的问题就消失了。打字错误缺少破折号。希望这可以帮助其他许多人。大多数困难都是由我们犯的细微错误造成的。
我很快发现 1) stackoverflow 上的一个线程,他们指责交叉构建 [
C++ 编译器不支持 C++11(例如 std::unique_ptr)。构建 OpenWRT],2) 博客中的一篇帖子,他们指责挂载目录和 c 标志 [https://thelinuxcluster.com/2021/10/01/the-c-compiler-does-not-support-c11- during-bootstrap-for-cmake/ ], 3) 一个 gitlab 线程,他们指责 distcc [ https://gitlab.kitware.com/cmake/cmake/-/issues/22573 ], 4) 在官方 CMake 论坛,他们将其归咎于 Windows [https://discourse.cmake.org/t/cmake-error-at-cmakelists-txt-117-message-the-c-compiler-does-not-support-c -11-e-g-std-unique-ptr/3774 ] 最后但至少是一个 gentoo 错误,他们也将其归咎于环境变量 [ https://bugs.gentoo.org/691544 ].
他们每个人都找到了不同的解决方法:将构建移动到另一个目录,重新安装存储点,将 c 标志更改为“-O3”,将 windows 子系统切换为 linux 实现,强制使用 C++14 等我个人绕过了这个检查,因为我确信我的编译器支持 C++11 特性,比如'std:unique_ptr',尽管 Cmake 抱怨。这不是一个明确的补丁,但自 2000 年代后期以来它一直是一个标准,很少有人不应该有 C++11 支持,那些没有的人必须非常清楚他们在做什么。
这是我在'cmake-3.21.4'中使用的补丁
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 9944ea4c..195fd842 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -96,17 +96,7 @@ if(NOT DEFINED CMAKE_CXX_STANDARD AND NOT CMake_NO_CXX_STANDARD)
endif()
endif()
endif()
-if(NOT CMake_TEST_EXTERNAL_CMAKE)
- # include special compile flags for some compilers
- include(CompileFlags.cmake)
-
- # check for available C++ features
- include(${CMake_SOURCE_DIR}/Source/Checks/cm_cxx_features.cmake)
- if(NOT CMake_HAVE_CXX_UNIQUE_PTR)
- message(FATAL_ERROR "The C++ compiler does not support C++11 (e.g. std::unique_ptr).")
- endif()
-endif()
# Inform STL library header wrappers whether to use system versions.
configure_file(${CMake_SOURCE_DIR}/Utilities/std/cmSTL.hxx.in
gmake[1]: warning: -jN forced in submake: disabling jobserver mode.
使 cmake 测试认为出了点问题。呃。 解决方法:
unset MAKEFLAGS
.无论如何,调查此错误的方法是阅读 CMakeFiles/CMakeError.log
vim /etc/profile
export LC_ALL=C
unset LANGUAGE
source /etc/profile
如果你发现setlocate
警告。