最近在用gfortran编译EGSnrc时出错,所以想用回g77编译。相信许多要编译大量旧fortran代码的人也有同样的需求。毕竟gfortan不能完全代替g77,许多用g77可以编译通过的代码,在gfortran下编译总会出各种各样的问题。GNU对此的解释是由于找不到足够的志愿者来将g77升级到gfortran,所以他们只好放弃了升级。当然你可以修改你的fortran代码使之符合新的fortran标准。但如果对于比较大的程序,这实在是一件令人头痛的事情。更何况我对EGSnrc的代码并不熟悉,比较好的选择是继续用g77编译它们。不幸的是Ubuntu已经将g77用gfortran代替了。虽然在dapper包中可以找到g77,但是安装时却因为各种依赖关系总是装不上。最后要降级cpp-3.4时会影响一大堆程序,所以没敢这么做。决定重新编译一个g77出来。
Ubuntu 9.04下整个编译安装过程主要参照“Linux下的gcc编译安装”,只是有几处不同。
在第4步配置时,我选用的enable-languages参数是--enable-languages=g77,c,c++。因为objc我编译时也通不过,因为不用就直接去掉拉。
最后一步库路径设置时,用export LD_LIBRARY_PATH=/home/allen/Programs/gcc-3.4.6/lib,即将LD_LIBRARY_PATH设置为你自己新安装的库目录。但即使每次启动时都设置此环境变量,有些情况下还是会找不对库。最后将/home/allen/Programs/gcc-3.4.6/lib(用你的库目录替换)加到文件/etc/ld.so.conf的最开始,然后运行/sbin/ldconfig将新配置写入cache。OK,这时候你的g77就可以正常的编译程序了。
但这时候新的问题又来了。由于libstdc++.so.6的版本冲突问题,即系统中的其它需要此库的程序也会先找到在你新指定的库目录下的低版本文件,而使这些程序不能使用。症状就是新立得也不能用了,也打不开ntfs的分区了,等等。把文件/etc/ld.so.conf中新加的目录去掉,重新运行/sbin/ldconfig。如果你设置了LD_LIBRARY_PATH,unset LD_LIBRARY_PATH.重新登录,果然一切又都正常了。当然g77就不能用了。如果能让不同的程序去找不同版本的库就好了。(期待有更好的方案......)
管不了那么多了,设置好库目录,先把我的东西编译了再说。编译运行EGSnrc有一些小问题,但那是EGSnrc自己的问题,已经不属于在这里讨论的范畴了。
搞完了,把库目录再去掉就是了(注意,要在你把实验做完,即你不想再运行你编译出来的程序后,而不是编译后,去掉)。有些麻烦,但我的东西能跑了,我常常也就这么得过且过了。在我search版本冲突问题时,也看到了对于此类问题的一些建议。对于追求完美的人来说,或许可以继续做下去,即不用动态库文件,而是用静态库(参考“gcc生成静态库和动态库”)。这样就不存在库路径的设置问题了。