关于g++和CMakeList寻找链接过程
起因
写这篇博客的起因是我要在 Ubuntu 18.04上运行高博的 faster-lio,里面运用了c++17 的执行策略语法 execution,这需要安装 g++-9 和 tbb,但是发现按照网上的教程里发现安装 tbb 需要额外下载安装,然后再修改 CMakeList,有点麻烦,很好奇为什么默认的效果不行。在之后的研究中我发现是我还有一个 CMakeList 没有看到,在那里设定了 tbb 搜索路径。
过程
使用 g++ 命令行进行编译的时候可以使用如下结构:
g++ -std=c++17 *.cpp -L 链接库目录 -I 头文件目录 -ltbb
后面的-ltbb经过搜索得知链接规则,想链接其他库只需要保留 -l,然后加上去掉想链接的 lib*.so 中的 * 部分即可。像 -I 就可以用于链接 eigen 。
在网上搜索链接 tbb 出现问题的解决方案一般都是调整 LD_LIBRARY_PATH 或者 /etc/ld.so.conf,但是我修改了之后仍然会报错。哪怕我将三个 libtbb.so 都复制到 /usr/lib和 /usr/local/bin 下依然不起作用。通过学习之后我才了解到链接分成编译时链接和运行时链接,而上面的步骤属于修改运行时链接,所以编译期直接报错了。
之后看文章才突然发现自己用 apt 安装 tbb 时发现电脑上已经有了一个不支持的较老版本,它被安装在了目录 /usr/lib/x86_64-linux-gnu/ 下。应该是每次链接的时候都链接到了这个老版本。我将/usr/lib/x86_64-linux-gnu/ 下的三个 libtbb*.so 替换之后就能够成功编译了。
关于 CMakeList 我之前一直很好奇为什么有些库在 find_package 之后能够通过${}的方式链接相关库而有些则是和命令行一样只链接名字。看了参考文章中的那篇 Cmake 的介绍之后我才了解在形如 Find*.cmake 的文件中有相关定义。
展望
有点遗憾的是我没有尝试在 LIBRARY_PATH 中添加 tbb 路径系统链接时能不能搜到。因为当时已经覆盖了,要改回去验证太麻烦。将来有机会再验证吧。还有就是在写本篇博客的时候我才发现还有 tbb.pc 这个文件许多路径都被定义在了里面,之后可以留心一下 .pc 文件。
参考文章
Ubuntu 16.04系统中使用GCC 9.1及Intel TBB库运行C++17 STL并行算法库
Ubuntu 16.04系统中GCC 9.1编译器安装方法及C++17标准测试示例

浙公网安备 33010602011771号