赞
踩
应用程序开发,一般是在个人电脑开发,部署在产线服务器上。而个人电脑可能是Windows,MacOS或者Linux,而线上电脑一般是Linux系统,与个人电脑可能不一致,静态编译类型语言(C/C++,Rust等)直接编译存在兼容问题,这时候就需要在个人电脑上通过交叉编译的方式编译产线服务器对应系统版本的可执行应用程序。
本文记录Windows 10系统配置Rust语言交叉编译Linux应用程序环境
。
添加target x86_64-unknown-linux-musl
rustup target add x86_64-unknown-linux-musl
rustup target list
... # 省略其他为安装target显示
x86_64-pc-windows-msvc (installed) # 这个是windows环境下配置rust默认安装的
x86_64-unknown-linux-musl (installed) # 这个是本次安装的
我们的目标服务器是Linux(CentOS 7),64bit, 所以我们添加的target应该是x86_64-unknown-linux-gnu
或者x86_64-unknown-linux-musl
。这2者区别与是动态依赖或者静态依赖:
在windows环境下编译(已经配置交叉编译x86_64-unknown-linux-gnu环境)
hello> cargo build --release --target=x86_64-unknown-linux-gnu
将目标文件拷贝到目标服务器ldd查下(windows下查看会报错:ldd: hello: Exec format error)
chmod +x hello
ldd hello
linux-vdso.so.1 (0x00007ffc79991000)
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007f351cd7b000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f351cb5d000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007f351c959000)
libc.so.6 => /lib64/libc.so.6 (0x00007f351c5ac000)
/lib64/ld-linux-x86-64.so.2 (0x00007f351cf91000)
文件大小:3333408
在windows环境下编译(已经配置交叉编译x86_64-unknown-linux-musl环境)
hello>cargo build --release --target=x86_64-unknown-linux-musl
将目标文件拷贝到目标服务器ldd查下(windows下查看会报错:ldd: hello: Exec format error)
chmod +x hello
ldd hello
statically linked
文件大小:3804368
在musl.cc网站下载对应的x86_64-linux-musl-cross.tgz,解压到指定目录,然后配置系统环境变量
# step 0, 查找链接(如果事先不知道) curl -s musl.cc | grep x86 https://musl.cc/x86_64-linux-musl-cross.tgz # 使用的是这个 https://musl.cc/x86_64-linux-musl-native.tgz https://musl.cc/x86_64-linux-muslx32-cross.tgz https://musl.cc/x86_64-linux-muslx32-native.tgz https://musl.cc/x86_64-w64-mingw32-cross.tgz https://musl.cc/x86_64-w64-mingw32-native.zip # step 1, 下载 https://musl.cc/x86_64-linux-musl-cross.tgz # step 2, 解压到指定目录 C:\Tools\x86_64-linux-musl-cross # step 3, 配置环境变量 我的电脑,属性,高级系统设置,环境变量,系统变量,Path 增加一段新的配置: C:\Tools\x86_64-linux-musl-cross\bin # step 4, 验证 x86_64-linux-musl-gcc -v ... #省略一堆,最后输出版本号 gcc version 9.2.1 20191214 (GCC)
step3添加环境变量示意图
windows 10 通过rustup安装的rust环境,cargo家目录为 C:\Users\{具体的用户}\.cargo
, 在该目录下编辑配置文件config [或者config.toml] ,没有就创建一个
# C:\Users\oyym\.cargo\config 其中oyym是我的用户名,每个用户都不同的
[target.x86_64-unknown-linux-musl]
linker = "x86_64-linux-musl-gcc"
提示:上述是全局配置,也可以在具体的项目跟目录创建 .cargo/config 文件进行针对具体项目的配置
# step 1, 创建项目,并交叉编译生成目标应用程序
cargo new hello
cd hello
cargo build --release --target=x86_64-unknown-linux-musl
# step 2,将目标应用程序传输到目标服务器
cd target\x86_64-unknown-linux-musl\release
scp hello root@192.168.1.1:/tmp/
# step 3,在目标服务器运行目标应用程序
ssh root@192.168.1.1
cd /tmp
chmod +x hello
./hello
Hello, world! # 这个是输出结果
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。