0%

编译5年前的老C项目

出于毕设需要,花了很长时间终于把 IndexFS-0.4 跑通了,对于如何编译老程序又多了一些新的手段,在这里整理一下。

首先是在编译 Thrift 过程中,出现 g++: internal error 这样让人摸不到头脑的错误。后来是发现对于某些比较大的项目,可能需要较多可用的核和大内存。比如 Thrift 就需要至少双核和 2GB 内存,而当时我是在虚拟机里面编译的,因此就会在等待很长时间之后报出上面那个错误,于是我回到实际 Ubuntu 上编译解决掉了这个问题。

接下来遇到的问题是可能目前 gcc/g++ 的版本过新,不兼容几年前的项目了。于是我只好 Google 如何管理本地的 gcc/g++ 版本,最终找到一种利用 update-alternatives 的方法,思路类似软链接,可以把 gcc/g++ 从安装的几个不同版本之间切换。而且,在切换 gcc-4 的时候发现 Ubuntu 18.04 是不存在这个版本的,只有 gcc-4.8 。现在想来好像切换版本并没有解决问题来着?我也忘了。不过重要的是,如果一个项目依赖其他项目提供的动态链接库,那么它们必须使用相同的 gcc 版本来编译得到,不然有可能无法链接。

动态链接是个非常恶心的问题。在编译 IndexFS 一直提示找不到 libgflags.so.2 ,然而我去看了一下发现这个软链接链接到正确的地方了。但是原文件貌似权限设的有点紧,于是我果断改成 +777 。然后直接 find /usr/local/lib -name libgflags.so.2 好像能找到,但是通过 ldd 查看动态链接库是否齐全还是找不到这个库。最后只能发飙,到 /etc/ld.so.conf.d/usr_local_lib.conf 硬把这个库加进去,然后 sudo /sbin/ldcondig 。如今想来,可能是编译的过程中太过滥用 su 导致的权限问题。之后还是老老实实只在必需的时候才用 sudo 吧。