Rust - 在x64的ubuntu上交叉编译x86-windows程序

突然想写个酷q插件玩玩,但是现在我基本把写代码等工作都移到了ubuntu里干了,win就用来打游戏和ps之类的。

但是呢,酷q插件必须要用msvc编译,然而linux木有vs。
于是去万能的咕鸽一下,不过基本找不到有价值的,很多都是说该用gnu工具链的(雾)。很明显,酷q插件必须用msvc工具链编译。

逛了一会,找到了一个古老的文章,在里面找到一个官方的文档

首先,安装一个工具lld,我是ubuntu,直接就

sudo apt install lld

就完事了。

然后搞一个lld-link包装器(文档是这么说的),我就用

ln -s /usr/bin/lld yourpath/lld-link

lld-link最好在你的$PATH里面,我呢就把它扔~/cargo/bin里了,反正也就写rust用的到(笑。

然后修改~/.cargo/config,添加:

[target.x86_64-pc-windows-msvc]
linker = "lld-link"
[target.i686-pc-windows-msvc]
linker = "lld-link"

这个是为了让cargo在编译的时候使用lld-link链接器。

接下来将Windows里的vs目录下的vc++和Windows10 sdk复制到linux这边来(当然,你Windows要先安装vs)。
因为我是双系统,所以我直接挂载win10的盘就把目录复制过来了。如果你不是跟我一样双系统的话,那就请各显神通啦。

大概路径如下,vs2015/2017和win8/10二选一,如图我想小学的语文水平就能看懂的。
TIM图片20191124145555.png

到最后一步,编译
首先,我们需要定义一个环境变量LIB,内容为我们复制过来的vc++库和windows sdk的路径。作为参考,我的是

export LIB=/home/soeur/CLionProjects/cqbot/libs/msvc/lib/x86\;/home/soeur/CLionProjects/cqbot/libs/win10/10.0.17763.0/ucrt/x86\;/home/soeur/CLionProjects/cqbot/libs/win10/10.0.17763.0/um/x86

注意,一共有3个路径,一个是vc++库,另外两个是win10 sdk里的路径(ucrt和um)。后面的x86根据需要改成x64,因为我要编译的目标平台是32位win,所以是x86。

然后是编译rust代码,

cargo build --target=i686-pc-windows-msvc

注意这里target跟上面环境变量里的路径里的x86、x64要符合。x64的target就用x64的win sdk和vc库,x86的target就用x86的win sdk和vc库。

so,合起来的话,就是

LIB=/home/soeur/CLionProjects/cqbot/libs/msvc/lib/x86\;/home/soeur/CLionProjects/cqbot/libs/win10/10.0.17763.0/ucrt/x86\;/home/soeur/CLionProjects/cqbot/libs/win10/10.0.17763.0/um/x86 cargo build --target=i686-pc-windows-msvc

(小声bb,单复制过来的vc++库和win10 sdk,就1.9G了。万恶的vs)