Rust交叉编译和不依赖glic之类的编译(内嵌这些依赖库)
Posted silentdoer
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Rust交叉编译和不依赖glic之类的编译(内嵌这些依赖库)相关的知识,希望对你有一定的参考价值。
通过命令查看支持哪些OS和CPU架构
rustc --print target-list | pr -tw100 --columns 3
通过ldd命令可以查看编译出来的程序是否依赖动态链接库:
1.先普通编译,比如cargo build --release(没有--release则是编译在debug目录)
2.通过ldd命令查看:ldd target/release/bin-name(bin-name是编译的可执行程序名字)
可以看到类似这样的输出:
linux-vdso.so.1 (0x00007ffd488b6000) libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007ff9c19e6000) librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007ff9c17de000) libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007ff9c15bf000) libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007ff9c13a7000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007ff9c0fb6000) /lib64/ld-linux-x86-64.so.2 (0x00007ff9c1e1f000)
说明是依赖了各类库的;
3.现在我们通过安装musl-libc工具链(比glibc要更轻量级,gnu-libc)
rustup target add x86_64-unknown-linux-musl(可以加--toolchain=stable,但是默认是stable,也可以安装nightly的)【可以用rustup show查看安装了哪些工具链,可以看到stable-x86_64-unknown-linux-gnu是默认的工具链】
【注意,目前PC的话大多处理器架构都是x86_64的,如果目标运行机器不是这个架构的需要做出调整,Linux可以通过arch命令查看处理器架构,Windows通过systeminfo查看,而且据说x86_64,x64,AMD64是同一个架构】
接着通过cargo build --release --target=x86_64-unknown-linux-musl编译出来后在target里会有个x86_64-unknown-linux-musl目录,里面又根据--release有debug和release目录;
接着我们再通过ldd命令查看在x86_64-unknown-linux-musl里的可执行程序,发现它不再依赖glibc这些库了【不是动态可执行文件(即静态可执行文件)】(程序大小大了一些,但多的不是很多);
一、在Ubuntu下编译Windows10的程序
1.rustup toolchain install stable-x86_64-pc-windows-gnu【用msvc的有问题,我这边编译失败(msvc其实就是指编译出来的程序直接依赖Windows平台的基础库,而gnu的则是开源的基础库直接内嵌到咱们编译的程序里,所以msvc的程序要更小】
2.rustup target add x86_64-pc-windows-gnu --toolchain=stable
3.安装linker:sudo apt install mingw-w64(ubuntu是这个命令,如果是其他Linux系统可以通过搜索关键字mingw-w64,然后描述是Development environment targeting 32- and 64-bit Windows的基本上就是了)
4.在项目根目录创建.cargo目录,然后创建.cargo/config文件,在config文件里写:
[target.x86_64-pc-windows-gnu] linker = "x86_64-w64-mingw32-gcc" ar = "x86_64-w64-mingw32-gcc-ar"
5.cargo build --release --target=x86_64-pc-windows-gnu,然后在target目录里有x86_64-pc-windows-gnu目录里有release目录可以找到对应可执行文件;
x86_64-pc-windows-gnu的程序用ldd查看也是不依赖动态库的;
二、在Ubuntu下编译Windows7的程序(待测,貌似基本和Windows10的步骤一致)
三、在Ubuntu下编译MacOS的程序(待测)
四、在Ubuntu下编译至其他Linux的程序【这里可以使用musl-libc将它内嵌到程序里实现跨多个平台的Linux程序(glibc是绝对路径,也可以在目标机器上安装glibc)】
1.rustup target add x86_64-unknown-linux-musl【下载x86_64任意版本Linux musl-libc库工具链】
2.cargo build --release --target=x86_64-unknown-linux-musl【如果依赖了openSSL还需要一些额外的配置】
3.用命令测试一下生成的可执行文件在目标机器、平台上是否可以运行:cargo test --target x86_64-unknown-linux-musl【最好还是复制到目标机器、平台运行一下看看。。(我这边test ubuntu到Windows的交叉编译的exe是失败,然后直接在Windows上跑是OK的)】
五、在Windows10下编译Linux的程序(待试)
六、在Windows10下编译为Windows7的程序(应该正常编译即可)
七、在Windows10下编译为MacOS的程序(待试)
以上是关于Rust交叉编译和不依赖glic之类的编译(内嵌这些依赖库)的主要内容,如果未能解决你的问题,请参考以下文章