Ubuntu 17.10安装build-essential及编译C代码报错求助
刚看完你遇到的这些编译问题,都是Ubuntu下做C开发尤其是CSAPP实验时常见的坑,我来一步步给你理清楚解决办法:
一、搞定make命令未安装与Hash Sum mismatch错误
当你执行make world提示命令不存在时,安装build-essential是完全正确的选择——这个包打包了make、gcc、g等基础编译工具,是C/C开发的必备套件。但你遇到的Hash Sum mismatch错误,大多是本地源缓存损坏或者网络同步不稳定导致的,按下面的步骤就能解决:
- 先清理本地的软件包缓存:
sudo apt clean - 重新拉取最新的源索引信息:
sudo apt update - 再次尝试安装
build-essential:sudo apt-get install build-essential
如果还是报错,就像你后来做的那样,换成国内的镜像源(比如阿里云、清华源),这类源的网络稳定性更好,能大幅减少校验错误的概率。
二、解决bits/libc-header-start.h: No such file or directory致命错误
首先得提一句:你写的world.c本身有语法错误——printf(hello!);里的字符串没加双引号,标准写法应该是printf("hello!");,而且main函数的标准返回类型是int不是void。修正后的代码应该是这样:
#include <stdio.h> int main() { printf("hello!\n"); return 0; }
不过即使修正了语法,出现这个头文件缺失错误,核心原因是64位Ubuntu默认只安装64位的编译组件,如果你的代码需要编译成32位程序(或者依赖32位头文件),就会找不到对应的头文件。解决办法就是安装多架构支持库:
sudo apt-get install gcc-multilib
这个包会自动安装32位的C标准库头文件和相关组件,直接解决这类跨架构编译的头文件缺失问题。
三、CSAPP DataLab程序的编译问题
你换源后DataLab的程序仍报错,本质和上面的问题是同一个:DataLab里的实验代码很多是针对32位环境设计的,64位系统默认没有对应的编译支持。安装gcc-multilib后,就能正常编译32位的实验程序了,这也是你最终解决问题的关键步骤。
内容的提问来源于stack exchange,提问作者J.Butter

