MacOS(Apple Silicon)编译Dockerfile安装g++-multilib等依赖报错
问题原因
这是典型的架构兼容问题,和Dockerfile写法、VSCode Remote Container配置本身无关:
- 你Windows设备是x86_64架构,Docker默认拉取
linux/amd64版本的Ubuntu 18.04镜像,g++-multilib、libc6-dev-i386本身就是x86平台专属的32位编译依赖包,用来给x86设备提供i386架构的库支持,在amd64镜像里可以正常安装。 - Apple Silicon芯片是arm64(aarch64)架构,默认拉取的是
linux/arm64版本的Ubuntu 18.04镜像,Ubuntu官方arm64源根本不提供i386架构的兼容包,安装这两个包的时候自然会报依赖找不到、架构不匹配的错误。
可行解决方法
根据你的实际需求选一个就行:
- 如果你不想改原有项目编译配置,直接强制Docker拉取amd64版本的镜像通过模拟运行:把Dockerfile第一行的
FROM ubuntu:18.04改成FROM --platform=linux/amd64 ubuntu:18.04即可。第一次启动容器时Docker会自动加载x86模拟层,记得在Docker Desktop设置里开启Rosetta x86模拟选项,能把转译性能拉到很高,日常跑ns-3仿真完全够用,唯一缺点是超大规模编译的时候速度会比原生arm容器稍慢。 - 如果你不需要编译32位版本的程序,直接删掉Dockerfile最后一行里的
g++-multilib libc6-dev-i386即可。这两个包唯一的作用就是提供x86 32位程序的编译依赖,ns-3默认编译的是64位程序,完全用不上这两个包,删掉之后容器会用原生arm64架构运行,没有任何性能损耗,是最省事的方案。 - 如果你确实需要在arm设备上编译32位程序,不要装i386架构的包,先执行
dpkg --add-architecture armhf && apt update添加arm32架构源,再安装g++-arm-linux-gnueabihf、libc6-dev:armhf这类arm32的交叉编译工具链,不过这种方案需要你手动修改项目的编译配置指定工具链,适配成本较高。
补充提示
你现在用的Ubuntu 18.04已经过了官方标准支持周期,软件源已经迁移到归档服务器,后续装包很容易出现404错误,如果不是项目强依赖18.04的特定版本库,建议替换成Ubuntu 22.04/24.04这类还在支持周期的LTS版本,兼容性和稳定性更好。
内容的提问来源于stack exchange,提问作者MachineLearnigBeginner
相关产品推荐
相关产品推荐

