【问题标题】:cmake configure error in 3.10.1 but not in 3.9.6cmake 在 3.10.1 中配置错误,但在 3.9.6 中没有
【发布时间】:2018-06-27 08:30:16
【问题描述】:

一个月前,我在 debian 挤压机上安装了 cmake,使用 cmake 3.9.6 并且运行良好。

现在,我正在另一台挤压机上安装 cmake,但是当我执行 ./configure 时它不起作用。 它说:

------------------------------------------------------------------------------------------
CMake 3.10.1, Copyright 2000-2017 Kitware, Inc. and Contributors
Found GNU toolchain
C compiler on this system is: gcc  
---------------------------------------------
Error when bootstrapping CMake:
Cannot find a C++ compiler supporting C++11 on this system.
Please specify one using environment variable CXX.
See cmake_bootstrap.log for compilers attempted.
---------------------------------------------
Log of errors: /home/doom/things/cmake-3.10.1/Bootstrap.cmk/cmake_bootstrap.log
---------------------------------------------

还有日志:

    Checking for GNU toolchain
Try: gcc
Line: gcc  cmake_bootstrap_28642_test.c -o cmake_bootstrap_28642_test
----------  file   -----------------------
int main() { return 0; }
------------------------------------------
Test succeeded
Try: g++
Line: g++  cmake_bootstrap_28642_test.cpp -o cmake_bootstrap_28642_test
----------  file   -----------------------
int main() { return 0; }
------------------------------------------
Test succeeded
Checking whether 'gcc  ' works.
Try: gcc
Line: gcc   cmake_bootstrap_28642_test.c -o cmake_bootstrap_28642_test
----------  file   -----------------------

#ifdef __cplusplus
# error "The CMAKE_C_COMPILER is set to a C++ compiler"
#endif

#if defined(__sun) && __STDC_VERSION__ < 199901L
#error "On Solaris we need C99."
#endif

#include <stdio.h>

int main(int argc, char* argv[])
{
  printf("%d%c", (argv != 0), (char)0x0a);
  return argc - 1;
}

------------------------------------------
1
Test succeeded
Checking whether 'g++  ' works.
Try: g++
Line: g++   cmake_bootstrap_28642_test.cxx -o cmake_bootstrap_28642_test
----------  file   -----------------------

#include <iostream>
#include <memory>
#include <unordered_map>

#if __cplusplus < 201103L
#error "Compiler is not in a mode aware of C++11."
#endif

#if defined(__SUNPRO_CC) && __SUNPRO_CC < 0x5140
#error "SunPro <= 5.13 mode not supported due to bug in move semantics."
#endif

class Class
{
public:
  int Get() const { return this->Member; }
private:
  int Member = 1;
};
int main()
{
  auto const c = std::unique_ptr<Class>(new Class);
  std::cout << c->Get() << std::endl;
  return 0;
}

------------------------------------------
In file included from /usr/include/c++/4.4/unordered_map:35,
                 from cmake_bootstrap_28642_test.cxx:4:
/usr/include/c++/4.4/c++0x_warning.h:31:2: error: #error This file requires compiler and library support for the upcoming ISO C++ standard, C++0x. This support is currently experimental, and must be enabled with the -std=c++0x or -std=gnu++0x compiler options.
cmake_bootstrap_28642_test.cxx:7:2: error: #error "Compiler is not in a mode aware of C++11."
cmake_bootstrap_28642_test.cxx:19: error: ISO C++ forbids initialization of member ‘Member’
cmake_bootstrap_28642_test.cxx:19: error: making ‘Member’ static
cmake_bootstrap_28642_test.cxx:19: error: ISO C++ forbids in-class initialization of non-const static member ‘Member’
cmake_bootstrap_28642_test.cxx: In function ‘int main()’:
cmake_bootstrap_28642_test.cxx:23: error: ISO C++ forbids declaration of ‘c’ with no type
cmake_bootstrap_28642_test.cxx:23: error: ‘unique_ptr’ is not a member of ‘std’
cmake_bootstrap_28642_test.cxx:23: error: expected primary-expression before ‘>’ token
cmake_bootstrap_28642_test.cxx:24: error: base operand of ‘->’ is not a pointer
Test failed to compile
Checking whether 'g++  -std=gnu++1z' works.
Try: g++
Line: g++  -std=gnu++1z cmake_bootstrap_28642_test.cxx -o cmake_bootstrap_28642_test
----------  file   -----------------------

#include <iostream>
#include <memory>
#include <unordered_map>

#if __cplusplus < 201103L
#error "Compiler is not in a mode aware of C++11."
#endif

#if defined(__SUNPRO_CC) && __SUNPRO_CC < 0x5140
#error "SunPro <= 5.13 mode not supported due to bug in move semantics."
#endif

class Class
{
public:
  int Get() const { return this->Member; }
private:
  int Member = 1;
};
int main()
{
  auto const c = std::unique_ptr<Class>(new Class);
  std::cout << c->Get() << std::endl;
  return 0;
}

------------------------------------------
cc1plus: error: unrecognized command line option "-std=gnu++1z"
Test failed to compile
Checking whether 'g++  ' works.
Try: g++
Line: g++   cmake_bootstrap_28642_test.cxx -o cmake_bootstrap_28642_test
----------  file   -----------------------

#include <iostream>
#include <memory>
#include <unordered_map>

#if __cplusplus < 201103L
#error "Compiler is not in a mode aware of C++11."
#endif

#if defined(__SUNPRO_CC) && __SUNPRO_CC < 0x5140
#error "SunPro <= 5.13 mode not supported due to bug in move semantics."
#endif

class Class
{
public:
  int Get() const { return this->Member; }
private:
  int Member = 1;
};
int main()
{
  auto const c = std::unique_ptr<Class>(new Class);
  std::cout << c->Get() << std::endl;
  return 0;
}

------------------------------------------
In file included from /usr/include/c++/4.4/unordered_map:35,
                 from cmake_bootstrap_28642_test.cxx:4:
/usr/include/c++/4.4/c++0x_warning.h:31:2: error: #error This file requires compiler and library support for the upcoming ISO C++ standard, C++0x. This support is currently experimental, and must be enabled with the -std=c++0x or -std=gnu++0x compiler options.
cmake_bootstrap_28642_test.cxx:7:2: error: #error "Compiler is not in a mode aware of C++11."
cmake_bootstrap_28642_test.cxx:19: error: ISO C++ forbids initialization of member ‘Member’
cmake_bootstrap_28642_test.cxx:19: error: making ‘Member’ static
cmake_bootstrap_28642_test.cxx:19: error: ISO C++ forbids in-class initialization of non-const static member ‘Member’
cmake_bootstrap_28642_test.cxx: In function ‘int main()’:
cmake_bootstrap_28642_test.cxx:23: error: ISO C++ forbids declaration of ‘c’ with no type
cmake_bootstrap_28642_test.cxx:23: error: ‘unique_ptr’ is not a member of ‘std’
cmake_bootstrap_28642_test.cxx:23: error: expected primary-expression before ‘>’ token
cmake_bootstrap_28642_test.cxx:24: error: base operand of ‘->’ is not a pointer
Test failed to compile
Checking whether 'g++  -std=gnu++14' works.
Try: g++
Line: g++  -std=gnu++14 cmake_bootstrap_28642_test.cxx -o cmake_bootstrap_28642_test
----------  file   -----------------------

#include <iostream>
#include <memory>
#include <unordered_map>

#if __cplusplus < 201103L
#error "Compiler is not in a mode aware of C++11."
#endif

#if defined(__SUNPRO_CC) && __SUNPRO_CC < 0x5140
#error "SunPro <= 5.13 mode not supported due to bug in move semantics."
#endif

class Class
{
public:
  int Get() const { return this->Member; }
private:
  int Member = 1;
};
int main()
{
  auto const c = std::unique_ptr<Class>(new Class);
  std::cout << c->Get() << std::endl;
  return 0;
}

------------------------------------------
cc1plus: error: unrecognized command line option "-std=gnu++14"
Test failed to compile
Checking whether 'g++  -std=gnu++1y' works.
Try: g++
Line: g++  -std=gnu++1y cmake_bootstrap_28642_test.cxx -o cmake_bootstrap_28642_test
----------  file   -----------------------

#include <iostream>
#include <memory>
#include <unordered_map>

#if __cplusplus < 201103L
#error "Compiler is not in a mode aware of C++11."
#endif

#if defined(__SUNPRO_CC) && __SUNPRO_CC < 0x5140
#error "SunPro <= 5.13 mode not supported due to bug in move semantics."
#endif

class Class
{
public:
  int Get() const { return this->Member; }
private:
  int Member = 1;
};
int main()
{
  auto const c = std::unique_ptr<Class>(new Class);
  std::cout << c->Get() << std::endl;
  return 0;
}

------------------------------------------
cc1plus: error: unrecognized command line option "-std=gnu++1y"
Test failed to compile
Checking whether 'g++  ' works.
Try: g++
Line: g++   cmake_bootstrap_28642_test.cxx -o cmake_bootstrap_28642_test
----------  file   -----------------------

#include <iostream>
#include <memory>
#include <unordered_map>

#if __cplusplus < 201103L
#error "Compiler is not in a mode aware of C++11."
#endif

#if defined(__SUNPRO_CC) && __SUNPRO_CC < 0x5140
#error "SunPro <= 5.13 mode not supported due to bug in move semantics."
#endif

class Class
{
public:
  int Get() const { return this->Member; }
private:
  int Member = 1;
};
int main()
{
  auto const c = std::unique_ptr<Class>(new Class);
  std::cout << c->Get() << std::endl;
  return 0;
}

------------------------------------------
In file included from /usr/include/c++/4.4/unordered_map:35,
                 from cmake_bootstrap_28642_test.cxx:4:
/usr/include/c++/4.4/c++0x_warning.h:31:2: error: #error This file requires compiler and library support for the upcoming ISO C++ standard, C++0x. This support is currently experimental, and must be enabled with the -std=c++0x or -std=gnu++0x compiler options.
cmake_bootstrap_28642_test.cxx:7:2: error: #error "Compiler is not in a mode aware of C++11."
cmake_bootstrap_28642_test.cxx:19: error: ISO C++ forbids initialization of member ‘Member’
cmake_bootstrap_28642_test.cxx:19: error: making ‘Member’ static
cmake_bootstrap_28642_test.cxx:19: error: ISO C++ forbids in-class initialization of non-const static member ‘Member’
cmake_bootstrap_28642_test.cxx: In function ‘int main()’:
cmake_bootstrap_28642_test.cxx:23: error: ISO C++ forbids declaration of ‘c’ with no type
cmake_bootstrap_28642_test.cxx:23: error: ‘unique_ptr’ is not a member of ‘std’
cmake_bootstrap_28642_test.cxx:23: error: expected primary-expression before ‘>’ token
cmake_bootstrap_28642_test.cxx:24: error: base operand of ‘->’ is not a pointer
Test failed to compile
Checking whether 'g++  -std=gnu++11' works.
Try: g++
Line: g++  -std=gnu++11 cmake_bootstrap_28642_test.cxx -o cmake_bootstrap_28642_test
----------  file   -----------------------

#include <iostream>
#include <memory>
#include <unordered_map>

#if __cplusplus < 201103L
#error "Compiler is not in a mode aware of C++11."
#endif

#if defined(__SUNPRO_CC) && __SUNPRO_CC < 0x5140
#error "SunPro <= 5.13 mode not supported due to bug in move semantics."
#endif

class Class
{
public:
  int Get() const { return this->Member; }
private:
  int Member = 1;
};
int main()
{
  auto const c = std::unique_ptr<Class>(new Class);
  std::cout << c->Get() << std::endl;
  return 0;
}

------------------------------------------
cc1plus: error: unrecognized command line option "-std=gnu++11"
Test failed to compile
Checking whether 'g++  -std=gnu++0x' works.
Try: g++
Line: g++  -std=gnu++0x cmake_bootstrap_28642_test.cxx -o cmake_bootstrap_28642_test
----------  file   -----------------------

#include <iostream>
#include <memory>
#include <unordered_map>

#if __cplusplus < 201103L
#error "Compiler is not in a mode aware of C++11."
#endif

#if defined(__SUNPRO_CC) && __SUNPRO_CC < 0x5140
#error "SunPro <= 5.13 mode not supported due to bug in move semantics."
#endif

class Class
{
public:
  int Get() const { return this->Member; }
private:
  int Member = 1;
};
int main()
{
  auto const c = std::unique_ptr<Class>(new Class);
  std::cout << c->Get() << std::endl;
  return 0;
}

------------------------------------------
cmake_bootstrap_28642_test.cxx:7:2: error: #error "Compiler is not in a mode aware of C++11."
cmake_bootstrap_28642_test.cxx:19: error: ISO C++ forbids initialization of member ‘Member’
cmake_bootstrap_28642_test.cxx:19: error: making ‘Member’ static
cmake_bootstrap_28642_test.cxx:19: error: ISO C++ forbids in-class initialization of non-const static member ‘Member’
Test failed to compile

但它在使用 cmake 3.9.6 的同一台机器上运行良好。

g++ 版本是gcc version 4.4.5 (Debian 4.4.5-8)。 最新可用在我的镜子上。

真的是g++版本的问题还是cmake新版本的问题?

如有需要,How can I install g++ compiler from sources?

感谢您的回答。

【问题讨论】:

    标签: cmake g++


    【解决方案1】:

    Since v3.10 onwards CMake is implemented in C++11:

    弃用和删除的功能

    不再支持使用 C++98 编译器构建 CMake。 CMake 现在使用 C++11 实现。

    这需要有能力的编译器。 C++11 功能完整的第一个 GCC 版本是GCC 4.8.1

    Gcc 4.4.5 超过 7 年了,更重要的是,它不支持 C++11(来自错误):

    在此系统上找不到支持 C++11 的 C++ 编译器。


    编译器更新

    如上所述,您需要至少 GCC 4.8.1。以下是一些指南:

    【讨论】:

    • g++ 支持一些功能,但不是全部features from C++11。谢谢你的回答。
    • cmake 3.9.6 在带有gcc 4.2.3gcc 4.4.3 的旧版Linux 上完美构建libssh
    【解决方案2】:

    选择最新版本的gcc编译器

    dpkg -l gcc*
    

    例如安装 gcc-5 版本并将其设为默认

    update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-5 60 --slave /usr/bin/g++ g++ /usr/bin/g++-5
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-21
      • 2019-08-18
      • 1970-01-01
      • 1970-01-01
      • 2018-06-07
      相关资源
      最近更新 更多