用rust编写了一个dll给别的程序调用,但是因为之前是编译为i686-pc-windows-msvc目标。这样生成的文件对msvc运行库有所依赖,造成一些没有vc运行库的机器运行有问题。

于是打算编译为i686-pc-windows-gnu目标试试。在windwos下尝试指定目标为i686-pc-windows-gnu后,首先报找不到i686-w64-mingw32-gcc这个编译器。因为不想在windows下装cygwin再装MinGW-w64,所以决定转战linux。在linux下通过MinGW-w64交叉编译为windows的dll。

然而在linux下指定这个目标后,又报了一堆的错误。总结下来就是链接的时候,两个函数找不到链接的目标。分别是_Unwind_RaiseException与_Unwind_Resume。

网上翻找了一堆的方法后,通过添加编译参数“-C panic=abort”消除了_Unwind_RaiseException这个函数的链接。然而_Unwind_Resume这个链接怎么也没有办法解决。甚至有人已经下结论这个问题没法解决。

PS:如果指定为x86_64-pc-windows-gnu(64位)目标是没有问题的,但是项目要求必须是32位。

最后实在没有办法的时候,想了一个损招,自己实现并导出了一个叫_Unwind_Resume的方法……

#[cfg(target_arch = "x86")]
#[no_mangle]
pub extern "C" fn _Unwind_Resume() -> ! {
    panic!("call _Unwind_Resume function, so crash and burn!");
}

终于编译过去,因为没有异常处理,所以运行起来也暂时没什么问题。先这么凑合用吧。看以后官方会不会修复这个问题……

标签: rust, dll, 32位, 交叉编译

添加新评论