树莓派3编译PCL库时出现cc1plus内存不足错误求助
解决树莓派3编译PCL时内存不足的问题
嘿,我之前在树莓派3上折腾PCL编译的时候,刚好碰到过和你一模一样的问题!明明看着还有1G空闲内存,结果编译到pcl_recognition模块的geometric_consistency.cpp就爆内存错误,其实这背后是几个树莓派特有的限制导致的,给你几个亲测有效的解决办法:
1. 先关掉你不需要的PCL模块(最见效)
你说只是要用到可视化命令行工具生成点云图片,那完全没必要编译整个PCL库!尤其是报错的pcl_recognition模块,本身就是内存大户,直接在cmake阶段把它关掉,同时关闭其他无关模块,能大幅减少编译压力:
cmake -DCMAKE_BUILD_TYPE=Release \ -DBUILD_EXAMPLES=OFF \ -DBUILD_TESTS=OFF \ -DBUILD_PCL_RECOGNITION=OFF \ -DBUILD_PCL_VISUALIZATION=ON \ -DBUILD_COMMAND_LINE_TOOLS=ON \ ..
这样编译的时候会直接跳过那个耗内存的文件,大概率能直接解决问题。
2. 调整交换空间(swap)
树莓派默认的swap空间很小(通常只有100MB左右),编译C++大文件时,哪怕物理内存还有剩余,编译器的内存峰值也可能需要用到虚拟内存,这时候swap不够就会报错。你可以临时把swap调到2G:
- 先停止当前swap:
sudo dphys-swapfile swapoff - 编辑swap配置文件:
sudo nano /etc/dphys-swapfile - 找到
CONF_SWAPSIZE,把数值改成2048,保存退出 - 重新生成并启用swap:
sudo dphys-swapfile setup && sudo dphys-swapfile swapon
注意:用完编译后记得把swap改回原来的大小,避免长期用大swap磨损SD卡。
3. 减少编译线程数
树莓派3是4核,但并行编译(默认-j4)会让多个编译进程同时抢占内存,瞬间把内存拉满。改成单线程或者双线程编译,能降低内存峰值:
- 如果用make编译:
make -j1 - 如果用cmake直接构建:
cmake --build . --parallel 1
4. 降低编译器优化级别
默认的-O3优化会让gcc消耗更多内存来做优化,改成轻度优化-O1或者大小优化-Os,能减少编译器的内存使用:
cmake -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_CXX_FLAGS="-O1" \ # 加上其他你需要的参数 ..
按这个顺序试下来,先关无用模块,再调整线程数,应该就能顺利编译完成了!
内容的提问来源于stack exchange,提问作者Socrats
相关产品推荐
相关产品推荐

