代码之家  ›  专栏  ›  技术社区  ›  doom

3.10.1中的cmake配置错误,但3.9.6中没有

  •  3
  • doom  · 技术社区  · 7 年前

    一个月前,我用cmake 3.9.6在debian挤压机上安装了cmake,效果很好。

    现在,我正在另一台挤压机上安装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?

    谢谢你的回答。

    2 回复  |  直到 7 年前
        1
  •  4
  •   Community CDub    4 年前

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

    已弃用和删除的功能

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

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

    Gcc 4.4.5为 7岁以上 更重要的是,它不支持C++11(从错误中):

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


    编译器更新

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

        2
  •  0
  •   ascripter    6 年前

    选择gcc编译器的最新版本

    dpkg -l gcc*
    

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