我正在尝试在C中构建一个简单的应用程序,在Windows中调用Rust函数,使用MinGW和GCC 4.9.3以及Rust 1.9.0稳定。这是源代码:
test.rs
#![crate_type = "staticlib"]
#[no_mangle]
pub extern "C" fn get_number() -> isize {
42 as isize
}
的main.c
#include <stdio.h>
int get_number();
int main()
{
printf("Hello, world!\n");
printf("Number is %d.\n", get_number());
return 0;
}
现在,我知道我应该在Rust中使用C兼容类型等等。但在进入程序正确性之前,有一个问题是Rust似乎生成了GCC不理解的目标文件。这是我正在尝试的:
rustc --emit obj test.rs
gcc -c main.c
gcc -static-libgcc test.o main.o -lmingw32 -o test.exe
但链接器命令终止于:
test.o: file not recognized: File format not recognized
collect2.exe: error: ld returned 1 exit status
我已经搜索了可以改变输出格式的Rust编译器指令,但我找不到任何。我读过Rust的FFI文档,但它没有提到这样的事情。通常,信息是关于从Rust调用C的。由于语法不兼容,要求Rust生成ASM文件并与GCC的as
组装不起作用。
这是Windows版本的Rust / GCC的兼容性问题吗?有什么办法可以从Rust生成兼容的目标文件吗?或者更确切地说,我应该要求Rust生成哪种输出才能实现这一目标?我也有兴趣在各种游戏机SDK上调用C语言中的Rust代码。我需要什么样的设置来最大化与其他链接器的兼容性?
答案 0 :(得分:4)
对我来说很好:
$ rustc test.rs --emit=obj
$ gcc -c main.c
$ file test.o
test.o: 80386 COFF executable not stripped - version 30821
$ file main.o
main.o: 80386 COFF executable not stripped - version 30821
$ gcc test.o main.o -o awesome
$ file awesome.exe
awesome.exe: PE32 executable (console) Intel 80386, for MS Windows
$ ./awesome.exe
Hello, world!
Number is 42.
$ rustc --version --verbose
rustc 1.9.0 (e4e8b6668 2016-05-18)
binary: rustc
commit-hash: e4e8b666850a763fdf1c3c2c142856ab51e32779
commit-date: 2016-05-18
host: i686-pc-windows-gnu
release: 1.9.0
$ gcc --version
gcc (GCC) 5.3.0