在现代系统编译GCC 3.0遇左值赋值错误 能否成功构建?
问题解答
报错根本原因
你遇到的编译报错是新旧C编译器的非标准扩展兼容性导致的:
current_binding_level宏展开后为三目运算符表达式,GCC 3.0的代码是基于当时的GCC 2.x编译器特性编写的- 老版本GCC支持非标准扩展:允许左值类型的三目运算结果直接作为赋值操作的左操作数,所以当年编写的代码是可以正常编译的
- 现代GCC默认禁用了该不符合C标准的古老扩展,会把三目表达式判定为不可赋值的右值,因此抛出
lvalue required as left operand of assignment错误
无需修改源码的构建方案
完全可以在现代系统完成GCC 3.0的构建,不需要放弃尝试,按以下步骤调整即可:
- 给宿主编译器的CFLAGS额外添加
-fpermissive参数,放开语法限制兼容老GCC的非标准语法 - 保留你已经配置的
-m32、-std=gnu90参数,同时提前安装对应发行版的32位兼容开发依赖:- Debian/Ubuntu系:安装
libc6-dev-i386、gcc-multilib包 - RHEL/CentOS/Fedora系:安装
glibc-devel.i686、libgcc.i686、gcc-multilib包
- Debian/Ubuntu系:安装
如果调整参数后仍遇到其他依赖冲突,更简单的替代方案是用QEMU启动一个2000年前后的老旧发行版镜像,旧系统原生匹配GCC 3.0的构建环境,完全不需要修改任何代码就能顺利编译完成。
内容的提问来源于stack exchange,提问作者yoursred
相关产品推荐
相关产品推荐

