Ubuntu16.04、18.04升级tbb库

编译错误详情

如图,编译代码时遇到这样一个错误看来是关于tbb库的一个错误

报错信息是围绕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

再次编译项目应该就可以通过了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值