之前讲过通过源码编译早期版GCC,最近发现一个通过deb安装早期版本GCC的方法,相对来说安装的成功率更高一点。
操作系统是Ubuntu 16.04(64位) ,安装的是GCC 3.4(包括gcc和g++)。我们需要如下5个安装包:
- gcc-3.4-base_3.4.6-6ubuntu5_amd64.deb
- cpp-3.4_3.4.6-6ubuntu5_amd64.deb
- gcc-3.4_3.4.6-6ubuntu5_amd64.deb
- libstdc++6-dev_3.4.6-6ubuntu5_amd64.deb
- g++-3.4_3.4.6-6ubuntu5_amd64.deb
需要的deb包可以在 http://old-releases.ubuntu.com/ubuntu/pool/universe/g/gcc-3.4/ 找到。
下载完安装包之后,就用sudo dpkg -i *deb
一次性安装,无需考虑依赖关系。安装完之后我们可以用
ls -l /usr/bin/gcc*
ls -l /usr/bin/g++*
来查看安装好的程序。这时候我们还不能直接使用,因为我们看到gcc和g++的符号链接还指向原来的程序。
比较粗暴的方式是直接修改原来的符号链接,但更为优雅的方式是使用update-alternatives
命令。使用方法很简单,掌握如下3条命令的用法就够了(下面直接给出例子):
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-3.4 40
:创建链接,后面四个参数分别是:链接名称、程序名称、指向的真实路径和优先级sudo update-alternatives --remove gcc /usr/bin/gcc-3.4
sudo update-alternatives --config gcc
用这几条命令,把两个版本的gcc和两个版本的g++合理的组织起来,以后就可以更方便的切换了。
接下来就编译一个小程序检验一下效果。很不幸的是,用gcc编译时出现了问题。
- 其中一类是这样的
/usr/bin/ld: cannot find crt1.o
。
- 解决方法是先用
find /usr/lib/ -name crt1.o
找到其在系统中的位置,然后建立符号链接ln -s /usr/lib/x86_64-linux-gnu/crt1.o /usr/lib/crt1.o
- 解决方法是先用
- 还有一个是这样的
/usr/bin/ld: cannot find -lgcc_s
。
- 解决方法是用
locate libgcc_s.so.1
找到实际位置,然后建立链接ln -sf /lib/x86_64-linux-gnu/libgcc_s.so.1 /usr/lib/gcc/x86_64-linux-gnu/3.4.6/libgcc_s.so
。这里用-f
参数是因为后面那个链接已经存在了,但我们可以用命令ls -l
看到原来的链接已经损坏了。
- 解决方法是用
解决了这些问题,就可以正常使用了。