红联Linux门户
Linux帮助

使用高版本gcc编译低版编译器

发布时间:2008-08-02 10:07:39来源:红联作者:lvcebo
使用高版本gcc编译低版编译器

作者:ferlyworld 周伯河
Email: zhoubohe@126.com
出处:http://blog.sina.com.cn/ferlyworld

为了在SUSE11和FC9上运行DMSO RTI 1.3NGv6 需要libstdc++.so.3.0.2,这是gcc-3.0.2的动态库文件,所以需要用高版本gcc编译低版本的gcc,在网上查了查关于这方面的资料,许多人认为需要逆向进行编译,及用4.2.x编译3.4.x,再用3.4.x编译3.2.x,再用3.2.x编译3.0.x,我试了试其实这样也是不能成功的。

于是下定决心解决SUSE11下用gcc-4.3.1直接编译gcc-3.0.2的问题,经过不懈努力,终于取得了成功,最后将解决的办法记录下来。

编译时主要出了两个问题
一个是gcc-3.0.2/gcc/cp/decl.c中存在 error: lvalue required as left operand of assignment的错误,原因是该文件中定义的宏在高版本编译器中不能用作左值使用

引用:
#define current_binding_level \
(cfun && cp_function_chain->bindings \
? cp_function_chain->bindings \
: scope_chain->bindings)


将所有使用current_binding_level做为左值使用的地方使用if-else结构代替就可以了

引用:
if(cfun && cp_function_chain->bindings)
{
cp_function_chain->bindings = ....;
}else{
scope_chain->bindings=....;
}


一个是在ctype_noinline(.h或.c记不清了)文件中__ctype_b;__ctype_tolower;__ctype_toupper;未定义的问题,解决方法是在文件的头部加入

#include

然后
将类成员变量初始化时这三个变量用

引用:
*(__ctype_b_loc());
*(__ctype_tolower());
*(__ctype_toupper());


代替就可以成功编译出gcc-3.0.2了

最后的心得是开源的东西出了问题时,通过分析代码里出错的问题是什么,都可以找到解决的途径。
文章评论

共有 0 条评论