Mac M1交叉编译x86_64 Linux Rust cdylib库链接报错咨询
在Mac M1(arm64架构)设备上编译cdylib类型的Rust crate,目标产物为x86_64 Linux平台可用的动态库文件,执行命令如下:
rustup target add x86_64-unknown-linux-gnu cargo build --target x86_64-unknown-linux-gnu
构建过程中触发报错:
= note: ld: unknown option: --version-script=/var/folders/df/1lz9t40n171_5550cy_f1h3c0000gn/T/rustczqz5TV/list
clang: error: linker command failed with exit code 1 (use -v to see invocation)
Mac系统默认自带的clang、ld工具链是为Darwin平台编译设计的,无法识别GNU ld专属的--version-script链接参数,也不能完成Linux平台目标文件的链接工作。仅安装Rust的目标平台三元组、不配置对应的交叉编译工具链,就会触发该链接错误。
1. 安装x86_64 Linux交叉编译工具链
通过Homebrew安装对应平台的编译、链接工具集:
brew install messense/macos-cross-toolchains/x86_64-unknown-linux-gnu
2. 配置Cargo指定交叉链接器
编辑当前用户的Cargo全局配置文件,路径为~/.cargo/config.toml,如果文件不存在则手动创建,添加以下配置段:
[target.x86_64-unknown-linux-gnu] linker = "x86_64-unknown-linux-gnu-gcc" ar = "x86_64-unknown-linux-gnu-ar"
3. 配置交叉编译环境变量
在当前终端会话中导入以下环境变量,保证编译、链接流程能正确找到对应平台的工具:
export CARGO_TARGET_X86_64_UNKNOWN_LINUX_GNU_LINKER=x86_64-unknown-linux-gnu-gcc export CC_x86_64_unknown_linux_gnu=x86_64-unknown-linux-gnu-gcc export CXX_x86_64_unknown_linux_gnu=x86_64-unknown-linux-gnu-g++ export AR_x86_64_unknown_linux_gnu=x86_64-unknown-linux-gnu-ar
如果需要长期使用该交叉编译配置,可以把上述export语句写入~/.zshrc(对应zsh终端)或~/.bashrc(对应bash终端),执行source对应配置文件后即可永久生效。
4. 重新执行构建
回到项目根目录,重新运行构建命令:
# Debug版本构建 cargo build --target x86_64-unknown-linux-gnu # 发布版本构建 cargo build --target x86_64-unknown-linux-gnu --release
构建完成后,对应产物会输出在target/x86_64-unknown-linux-gnu/debug/或target/x86_64-unknown-linux-gnu/release/目录下,可直接拷贝到x86_64架构的Linux设备上使用。
补充说明:纯Rust实现的cdylib crate无需额外依赖即可完成编译,如果项目引用了依赖C语言实现的第三方crate,需要额外安装对应平台的C依赖库才能正常构建。
内容的提问来源于stack exchange,提问作者doki

