Mac下从Ubuntu迁移源码编译Chromium报clang无法执行错误求助
问题根因
报错的核心原因是你跨平台打包源码时,把Ubuntu服务器端同步下来的Linux平台专属预编译Clang二进制一起打包带到了Mac上。Mac系统无法执行Linux ELF格式的可执行文件,因此直接抛出cannot execute binary file错误。
你源码路径里的third_party/llvm-build/目录,是Chromium构建流程自动拉取的、和当前操作系统匹配的预编译LLVM工具链:在Linux服务器上执行fetch chromium、gclient sync时,这个目录下存放的全是Linux可执行的二进制文件,跨平台复制后无法在Mac环境运行。
分步解决操作
- 清理从Linux端带过来的不兼容工具链
进入本地Mac的Chromium源码根目录,执行命令删除残留的Linux版Clang:rm -rf third_party/llvm-build/Release+Asserts
如果不提前删除这个目录,哪怕重新执行gclient sync,程序检测到目录已存在也不会重新拉取Mac版工具链,会一直复用原来的Linux二进制触发报错 - 拉取匹配Mac平台的正确工具链
在源码根目录执行重置式依赖同步,自动拉取适配Mac系统的预编译LLVM、所有跨平台不兼容的依赖文件会被自动替换:gclient sync --reset --delete_unversioned_trees
同步完成后可以提前验证工具链是否正确:file third_party/llvm-build/Release+Asserts/bin/clang
正常输出应该是Mach-O 64-bit executable格式,说明Mac版Clang已经部署完成。 - 清理旧的构建配置后重新编译
之前生成的out/Default目录里残留了Linux端的路径配置,直接复用会触发其他兼容问题,需要先删除:rm -rf out/Default
重新生成构建配置后即可启动编译:gn gen out/Default autoninja -C out/Default chrome
后续跨平台打包的避坑提示
从Linux服务器打包源码回Mac时,不要直接把同步完成的全量目录打包,需要先在服务器端删除所有平台专属的生成目录,避免带过来不兼容的二进制文件:
- 打包前在服务器端先清理:
rm -rf third_party/llvm-build out/ .gclient_cache - 仅打包纯源码仓库、DEPS配置、.gclient文件,回到本地Mac后再执行
gclient sync拉取对应平台的所有依赖和工具链,从根源上避免跨平台文件不兼容问题。
内容的提问来源于stack exchange,提问作者Fitmao
相关产品推荐
相关产品推荐

