当前位置:   article > 正文

Windows 10 配置Rust交叉编译Linux应用程序-musl_windows x86_64-linux-musl-gcc

windows x86_64-linux-musl-gcc

应用程序开发,一般是在个人电脑开发,部署在产线服务器上。而个人电脑可能是Windows,MacOS或者Linux,而线上电脑一般是Linux系统,与个人电脑可能不一致,静态编译类型语言(C/C++,Rust等)直接编译存在兼容问题,这时候就需要在个人电脑上通过交叉编译的方式编译产线服务器对应系统版本的可执行应用程序。

本文记录Windows 10系统配置Rust语言交叉编译Linux应用程序环境

1. 添加需要的target

添加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) # 这个是本次安装的
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

我们的目标服务器是Linux(CentOS 7),64bit, 所以我们添加的target应该是x86_64-unknown-linux-gnu 或者x86_64-unknown-linux-musl。这2者区别与是动态依赖或者静态依赖:

  • x86_64-unknown-linux-gnu 是动态依赖,目标服务器需要包含动态依赖的相关库(用户共享库),例如:
    在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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
  • x86_64-unknown-linux-musl 是静态依赖,目标服务器不需要包含相应的库,但是打包文件会更大些,例如:
    在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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

2. 配置编译链接程序

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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

step3添加环境变量示意图
在这里插入图片描述

3. 配置cargo交叉编译target使用的链接程序

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"
  • 1
  • 2
  • 3

提示:上述是全局配置,也可以在具体的项目跟目录创建 .cargo/config 文件进行针对具体项目的配置

4. 交叉编译hello项目,并在远程Linux服务器进行验证

# 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!  # 这个是输出结果
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/189252
推荐阅读
相关标签
  

闽ICP备14008679号