码迷,mamicode.com
首页 > 其他好文 > 详细

Rust交叉编译和不依赖glic之类的编译(内嵌这些依赖库)

时间:2020-06-01 12:05:04      阅读:231      评论:0      收藏:0      [点我收藏+]

标签:amd   nss   link   build   tar   通过   glib   open   最好   

通过命令查看支持哪些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之类的编译(内嵌这些依赖库)

标签:amd   nss   link   build   tar   通过   glib   open   最好   

原文地址:https://www.cnblogs.com/silentdoer/p/13024037.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!