关于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并行算法库

gcc/g++ 头文件和库文件搜索路径

Ubuntu 16.04系统中GCC 9.1编译器安装方法及C++17标准测试示例

关于Ubuntu安装多个opencv或其他库,系统优先级的问题

一文搞懂动态链接库的各种路径的意义与设置

CMake库搜索函数居然不搜索LD_LIBRARY_PATH? 由编译工具使用体验而引发的思考

posted @ 2022-10-02 17:09  MuySilgan  阅读(235)  评论(0)    收藏  举报