时间过得好快,转眼间2020年了,想起第一次接触rust的时候还是2019年7月底。当时真是惊艳到我了,于是就走上了不归路。
rust特性这里就不多说什么了,官网,社区,知乎多的是介绍和资源,再说我rust水平也没多高。
最近一段时间一直用rust写东西,主要是游戏服务器相关的东西,偶尔的机会,现在能让我用rust在工作当中,这tm把老夫给高兴坏了,那不tm整起来?
一顿啪啪啪,把之前写的加上优化调优,测试,压测再调优再....反复多次后,项目写得差不多了,因为是游戏服务器,那么目标是跑在linux系统的,然后win或者MacOS下面写的代码就要撸到linux上面跑。
高级语言写惯了的朋友可能知道交叉编译是个啥,但也许认知没有那么深刻,真正去搞的时候,还是会有坑的,在此我分享一下我的坑,希望能帮助到人。
总所周知,高级语言往往都带有比较大的运行时,比如虚拟机,比如各种VM,因为你的程序是vm在维护,你只需要写vm认识的东西就好了,然后在目标OS上装对应版本的VM,那么,其他的就不用管了,典型的例子就上JVM,只要有字节码,就行。
那么像c/c++/rust这类的是不是写好了代码编译下就行了呢,当然行,但也只能在你本机上行,不过没任何准备,想跑在别的系统,是不可以的。
所以就出现了我们在win(或者linux,macOS)上面上面写的代码,直接编译到本机,或者linux,macOS,unix,然后把编译好的可执行文件传过去就能运行,这就是交叉编译。
官网有交叉编译的教程:Configuration - The Cargo Bookdoc.rust-lang.org
跟着配置就行了,那么除了rust自带的工具以外,我们要做什么呢?
去下载相关target的工具链:musl libc toolchains | static cross/native toolchainsmusl.cc
下载好了之后,配置好环境变量,可以让你的rust能直接访问,打个完整的比方,我要把macOS写的编译到linux,怎么弄呢?
1:配置好.cargo/config,在上面配好target,比如
[target.x86_64-unknown-linux-musl]
linker = "x86_64-linux-musl-gcc"
2:去上面的http://musl.cc把对应的x86_64-unknown-linux-musl-cross.tgz下好,然后编辑".bash_profile"在末尾加上这句
export PATH="$PATH:$HOME/code/tool/x86_64-linux-musl-cross/bin"
友情提示,“$PATH:”这个一定要加哦,不然直接覆盖了之前的环境配置,只要执行source .bash_profile,那么你一大堆命令将无法执行(也不是无法执行,只是无法直接调用了,要用绝对路径调用)
3.然后敲命令行“x86_64-linux-musl-gcc -v”,会输出一大堆乱七八糟的,看最后的版本号就行,有它,你就可以点根烟犒劳下自己了。
如果有问题,检查下,是不是下错了?如果是mac要下mac下对应的x86_64-unknown-linux-musl-cross.tgz,以此类推,如果下错则嗝屁,编译的时候,一大堆错误信息在床上摆好姿势等着你。
4.用rustup命令把你要编译到的target下载好,这个很简单,除了断网,和小水管,不会出问题的,如果不知道rust是否支持你要编译到的目标平台,用rustup target list看下就知道了。
5.执行“cargo build --release --targetx86_64-unknown-linux-musl”
然后就可以在target目录里面看到编译好的可执行的目标目录了,进去就有你要看到的东西。
可能有朋友想问,为什么我用rustup下载好了对应目标平台的东西,还要去http://musl.cc去下另外一个呢?还要配置环境变量。
答案是:rustup下载的,和http://musl.cc下载的是不同的,你可以到rustup的目录,然后进toolchains里面看看,再到从http://must.cc下载的工具链里面看看,就知道,前者是一些rust自身对target的支持,而后者,则是交叉编译的关键,里面各种target的编译库和可执行文件。
其实官方团队做了一个工具,cross,挺好用,但是我发现,当我在项目里面引用自己的本地库时,居然识别不了路径,直接识别成“/”目录下的,我配置的是相对路径,我倒腾了几下没搞定,算了,干脆自己下工具链搞好了。当然还有xargo啊之类的工具,不一一说了,
另外,有什么问题,自己解决不了的,推荐去官方社区寻求帮助,rust社区真挺好的。大家互助才能让社区更加健康,稳定,发展。
好了,就写到这儿,希望能帮到刚入门,刚接触交叉编译的同学。
下班了,回家,文中如有不对,请指正。