作者: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了
最后的心得是开源的东西出了问题时,通过分析代码里出错的问题是什么,都可以找到解决的途径。