搜gcc-3.4.0.tar.gz这种老版本源码包的人,多半不是怀旧,而是被现实逼的:手头有老代码,新编译器编不过,只能回头找当年的版本。这在维护老嵌入式项目、老系统软件时是真实存在的刚需。
先解释下这个文件名。gcc是GNU编译器套装,3.4.0是2004年发布的版本号,tar.gz是源码压缩包格式。那个年代GCC 3.x系列正是主力,大量的嵌入式工具链、老的Linux内核2.4时代代码,都是基于它构建的。代码跟编译器是有默契的,当年的代码用了些后来被收紧的语法或者行为,用GCC 12、13去编,报错能刷屏。
从源码编译安装老GCC的流程是标准的三部曲:解压后进目录,configure脚本配置安装路径和目标,make编译,make install安装。但坑也在这里:用现代系统编2004年的代码,本身就是穿越。新版系统里的头文件、glibc版本、甚至新GCC自身的检查,都会让老代码编不过,常见要处理的包括一些内联函数的语法变更、旧代码里假设的默认行为被新标准改掉。
所以更实际的做法是降低穿越难度。找一台或者虚拟一个当年的系统环境,比如老版本的CentOS、Debian,在那个时代的glibc和工具链下编老GCC,成功率直线上升。容器技术普及之后,也有人把老构建环境整个做成镜像,编老代码就进老环境,互不干扰。
如果目的只是编译某份老代码,还有一条更省事的路:直接找当年预编译好的交叉工具链或者编译器二进制包,很多老项目的社区里还存着,比从源码编省几个小时。
这件事给开发者的启示也挺实在:构建环境要跟代码一起存档。项目交付时把编译器版本、依赖库版本、系统环境记录下来,有条件的整个打包成虚拟机或容器镜像,十年后别人要重建,不用再去考古。老代码不可怕,可怕的是没人记得它当年是怎么编出来的。
下一篇:没有了