关于安装ceres时报错‘exclusive_scan‘ is not a member of ‘std‘的问题解决

在尝试编译orb_slam时遇到ceres安装问题,错误涉及std::exclusive_scan。发现该算法为c++17特性。通过升级gcc和g++到11版本成功解决。升级步骤包括添加源、安装、设置版本优先级,并验证版本。随后cmake重新配置,ceres安装完成。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在跑orb_slam,在安装ceres时碰到了error没有解决。先说结论,把gcc和g++升级到11版本即可。
make -j16报错如下:

'exclusive_scan' is not a member of 'std'

上ceres的github issue和Stack Overflow上搜,了解到这个exclusive_scan是c++17的新算法。
那么该如何解决呢,首先想到在cmakelist.txt里加

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)

其实是没有用的。后来找到了c++官网关于算法库的描述,链接: https://en.cppreference.com/w/cpp/algorithm/exclusive_scan. 在这里插入图片描述
这里有个在线编译,选择gcc11.3编译器是编译成功的,选择gcc5.2是编译失败的。
然后在前面的https://en.cppreference.com/w/cpp/compiler_support可以看到c++17编译器至少是gcc7,emmm还是升级到gcc11吧。。。。

下面就是抄代码升级到gcc11了,根据博客

// 先查看当前版本
gcc --version
g++ --version
// 升级至11
// 添加源并更新
sudo add-apt-repository ppa:ubuntu-toolchain-r/test
sudo apt update
// 安装
sudo apt install gcc-11 g++-11
// 查看目前安装了多少版本的gcc
sudo updatedb && sudo ldconfig
locate gcc | grep -E "/usr/bin/gcc-"

// 命令最后的1和10是优先级,如果使用auto选择模式,系统将默认使用优先级高的
// 假设只安装了GCC/G++ 7和11版本
sudo update-alternatives --remove-all gcc
sudo update-alternatives --remove-all g++

sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-7 1
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-11 10

sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-7 1
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-11 10

// 验证
gcc --version
g++ --version

接下来就是cmake三连了,ceres最新版本都行。
继续学习!

ceres安装验证

bin/simple_bundle_adjuster ../data/problem-16-22106-pre.txt
<think>好的,我现在遇到了一个C++编译错误,错误信息是‘integer_sequence’ is not a member ofstd’。我需要弄清楚这个错误的原因以及如何解决它。首先,我应该回顾一下std::integer_sequence的相关知识。 std::integer_sequence是C++14引入的一个模板类,用于在编译生成整数序列,常用于元编程和可变参数模板的场景中。如果编译器不支持C++14或者项目没有启用C++14标准,就会导致这个错误。比如,在代码中使用了std::integer_sequence,但编译指定的是C++11,那么编译器自然找不到这个定义。 接下来,我需要检查项目的编译配置。用户提到在CMakeLists.txt中可能有相关的设置。根据引用[3]和引用[4],他们通过设置CMAKE_CXX_FLAGS或add_compile_options来指定C++标准。比如,使用-std=c++14代替-std=c++11。另外,引用[5]指出,当项目中不同依赖使用的C++标准不一致,比如A-LOAM和Ceres,需要统一它们的C++版本,否则可能引发兼容性问题。 可能的解决方案包括:1. 确保编译器支持C++14;2. 在CMake中明确设置C++14标准;3. 检查所有依赖库的C++标准是否一致。例如,修改CMakeLists文件,添加add_compile_options(-std=c++14)或者set(CMAKE_CXX_STANDARD 14)。同,也要确认使用的Ceres库是否要求更高的C++版本,可能需要更新Ceres到兼容的版本。 另外,还需要考虑编译器的版本是否过旧。如果使用的是GCC,需要确保版本至少是5.0以上,因为早期版本对C++14的支持不完全。同样,Clang和MSVC也有对应的版本要求。如果编译器太旧,升级编译器也是一个解决办法。 总结起来,解决步骤应该是:确认编译器版本支持C++14;修改项目的编译选项,强制使用C++14;检查并统一所有依赖库的C++标准设置。这样应该能解决‘integer_sequence’不在std命名空间中的问题。</think>### C++ `std::integer_sequence` 编译错误解决方案 #### 错误原因分析 `std::integer_sequence` 是 C++14 标准引入的模板类,用于生成编译期整数序列[^2]。若出现编译错误 `error: ‘integer_sequence’ is not a member ofstd’`,通常由以下原因导致: 1. **编译器未启用 C++14 或更高标准**:项目配置中未显式指定 C++14 标准,导致编译器默认使用旧版本(如 C++11)。 2. **编译器版本过低**:旧版本编译器(如 GCC <5.0)未完整支持 C++14。 3. **依赖库标准不一致**:项目中不同依赖(如 Ceres 和 A-LOAM)使用不同的 C++ 标准[^5]。 --- #### 解决步骤 1. **确认编译器支持 C++14** - 检查编译器版本: ```bash g++ --version # GCC 需 >=5.0 clang++ --version # Clang 需 >=3.4 ``` - 若版本过低,升级编译器(如使用包管理器或官方安装包)。 2. **修改 CMake 配置** - **方法一**:在 `CMakeLists.txt` 中设置全局 C++14 标准: ```cmake set(CMAKE_CXX_STANDARD 14) set(CMAKE_CXX_STANDARD_REQUIRED ON) ``` - **方法二**:添加编译选项(适用于旧版 CMake): ```cmake add_compile_options(-std=c++14) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14 -O2 -g -Wall") ``` 注意:若项目包含多个库(如 Ceres),需确保所有依赖的 C++ 标准一致。 3. **检查依赖库兼容性** - 若依赖库(如 Ceres)要求更高标准(如 C++17),需同步升级项目配置: ```cmake set(CMAKE_CXX_STANDARD 17) ``` - 重新编译依赖库以匹配当前项目标准。 4. **验证代码兼容性** - 确保代码未混用 C++11 和 C++14 特性。例如,`std::index_sequence` 在 C++14 中才能直接使用[^2]。 --- #### 示例配置 以下为修复后的 `CMakeLists.txt` 片段: ```cmake cmake_minimum_required(VERSION 3.10) project(MyProject) set(CMAKE_CXX_STANDARD 14) # 强制使用 C++14 set(CMAKE_CXX_STANDARD_REQUIRED ON) find_package(Ceres REQUIRED) add_executable(main main.cpp) target_link_libraries(main Ceres::ceres) ``` ---
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值