编译错误详情
如图,编译代码时遇到这样一个错误
报错信息是围绕tbb库
先说结论:环境中tbb版本太低,要升级一下
(下面记录下编译错误的原因,可以根据目录直接跳转到tbb升级方法)
我的系统是Ubuntu18.04(16.04也会出现这个编译问题),通过二进制安装的tbb版本是比较低的
sudo apt install libtbb-dev #版本较低,会引发编译错误
而在我的代码中用到了std::execution::seq,这是 C++17 并行 STL 引入的一个执行策略,表示以串行方式(sequential)执行 for_each,尽管代码中指定了串行执行策略,但并行 STL 中依赖的实现通常还是需要 TBB(Threading Building Blocks)等并行库来实现对多线程环境的支持和调度。
std::for_each(std::execution::seq, index.begin(), index.end(), [&](auto idx){
matches[idx].second = idx;
matches[idx].first = bfnn_point(cloud1, ToVec3f(cloud2->points[idx]));
});
程序需要依赖tbb,而系统里tbb版本较低带来了编译错误,所以需要升级tbb
https://github.com/oneapi-src/oneTBB/tags
升级方法:
首先需要下载升级包:
方式1:从github下载,选择2019及以上的版本即可
方式2:从高翔博士的git仓库可以下载到2019版本(推荐,升级能省一些步骤)
升级GCC-9
编译需要安装GCC-9,一般Ubuntu16.04或者18.04中默认是GCC-7,需要先升级下GCC
sudo add-apt-repository ppa:ubuntu-toolchain-r/test
sudo update-alternatives --remove-all gcc
sudo update-alternatives --remove-all g++
sudo apt install gcc-9 g++-9
#命令最后的1和10是优先级,如果使用auto选择模式,系统将默认使用优先级高的
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-7 1
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-9 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++-9 10
确认下此时gcc版本
g++ -v
升级tbb
升级gcc后,我们到存放tbb压缩包的目录打开一个终端
解压下tbb(以2019_U8.tar.gz 为例)
tar -zxvf 2019_U8.tar.gz
cd oneTBB-2019_U8/ # 进入解压后的文件夹
修改linux.gcc.inc
如果用的方式1下载,我们需要修改下oneTBB-2019_U8/build/目录下的linux.gcc.inc文件
方式2下载则不需要,可以直接看编译部分
我们先拷贝一份
cp build/linux.gcc.inc build/linux.gcc-9.inc
编辑下拷贝的linux.gcc-9.inc
修改下15,16行
CPLUS ?= g++-9
CONLY ?= gcc-9
修改后如图
编译
make compiler=gcc-9 stdver=c++17 tbb_build_prefix=my_tbb_build
编译完成后我们安装,我们要把编译好的库文件放到/usr/local/下,并建立升级版tbb的符号链接
sudo mkdir /usr/local/tbb-2019_U8
sudo cp -r include/ /usr/local/tbb-2019_U8/include
sudo ln -s /usr/local/tbb-2019_U8/include/tbb /usr/local/include/tbb
sudo cp -r build/my_tbb_build_release/ /usr/local/tbb-2019_U8/lib
sudo ln -s /usr/local/tbb-2019_U8/lib/libtbb.so.2 /usr/local/lib/libtbb.so
sudo ln -s /usr/local/tbb-2019_U8/lib/libtbbmalloc.so.2 /usr/local/lib/libtbbmalloc.so
sudo ln -s /usr/local/tbb-2019_U8/lib/libtbbmalloc_proxy.so.2 /usr/local/lib/libtbbmalloc_proxy.so
最后我们把库文件路径添加到环境变量里面
echo 'export LD_LIBRARY_PATH=/usr/local/tbb-2020_U3/lib:$LD_LIBRARY_PATH' >> ~/.bashrc
source ~/.bashrc
再次编译项目应该就可以通过了