Rust的.o文件格式无法被GCC识别

时间:2016-06-17 23:09:39

标签: c gcc linker rust

我正在尝试在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代码。我需要什么样的设置来最大化与其他链接器的兼容性?

1 个答案:

答案 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