Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

The C++ compiler does not support C++11 (e.g. std::unique_ptr). building OpenWRT

I am using instructions here and here to build OpenWRT in ubuntu but am getting:

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!

There was a solution to a similar problem here, however it is not clear to me which CMakeLists.txt file is the 'root' in my case. Not seeing much on the OpenWRT forums (or search engines in general) about this fail.

The impression I get is that the CMake installation is downloaded by the OpenWRT builder itself, as I do not have CMake installed and installing cmake resolved nothing.

Tried checking out latest OpenWRT v18.06.2. When that failed to build I deleted the cloned directory and tried v18.06.0-rc2. There was no improvement.

Also tried

export CMAKE_CXX_STANDARD=11

before running 'make' ... it did not resolve the issue.

The state of my g++ install:

$ 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)

Well, that's 5 hours I'm out of ideas. Could this be a misconfiguration or a bug on the dev end?

If a misconfiguration, what could be set up wrong?

like image 290
user515655 Avatar asked Apr 20 '19 10:04

user515655


3 Answers

I paste my solution here so that someone might get my hint (or it might not because of this reason)

after search millions of pages and people just talk about why but not how, my solution is simply:

copied cmake source code to my system drive. if you make cmake on a remote hardrive it will fail and error just like above

like image 163
Nicholas Jela Avatar answered Nov 15 '22 02:11

Nicholas Jela


My bad experience could help others. I have gcc 7.4.0. On the same machine I had no problem configuring my package. One day I decided to build a optimized version

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.

Note: after doing export CXXFLAGS="-O3" my problem went away. The typo is missing the dash. Hope this could help many others. Most difficulties are caused by subtle mistake we made.

like image 43
Kemin Zhou Avatar answered Nov 15 '22 02:11

Kemin Zhou


There were several more complains about this bug.

I promptly found 1) a thread at stackoverflow where they blame cross build [ The C++ compiler does not support C++11 (e.g. std::unique_ptr). building OpenWRT ], 2) a post in a blog where they blame mount directory and c flags [ https://thelinuxcluster.com/2021/10/01/the-c-compiler-does-not-support-c11-during-bootstrap-for-cmake/ ], 3) a gitlab thread where they blame distcc [ https://gitlab.kitware.com/cmake/cmake/-/issues/22573 ], 4) a discussion in the official CMake forum where they blame windows for it [ 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 ] and last but least a gentoo bug where they blame enviroment variables too [ https://bugs.gentoo.org/691544 ].

Each of them finds a different work around: moving the build to another directory, remounting a storage point, changing c flags to "-O3", switching windows subsystem for linux implementation, force usage of C++14, etc.

I personally bypassed this check as I was sure my compiler supported C++11 features like 'std:unique_ptr' despite Cmake complains. It's not a definite patch, but as it's been a standard since late 2000's, very few people should not have C++11 support and those who don't must be very well aware of what they're doing.

Here's the patch I used in '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
like image 27
Marcelo Teixeira Ruggeri Avatar answered Nov 15 '22 02:11

Marcelo Teixeira Ruggeri