2016-06-17 4 views
0

Ich versuche eine einfache Anwendung in C zu erstellen, die Rust Funktionen in Windows aufruft, mit MinGW mit GCC 4.9.3 und Rust 1.9.0 stable. Hier ist der Quellcode:Rust's .o Dateiformat nicht von GCC erkannt

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; 
} 

Nun, ich weiß, ich C-kompatible Typen in Rust und so weiter verwendet werden soll. Aber bevor wir in die Programmkorrektheit gehen, gibt es ein Problem darin, dass Rust anscheinend Objektdateien erzeugt, die GCC nicht versteht. Hier ist, was ich versuche:

rustc --emit obj test.rs 
gcc -c main.c 
gcc -static-libgcc test.o main.o -lmingw32 -o test.exe 

Aber der Linker Befehl endet mit:

test.o: file not recognized: File format not recognized 
collect2.exe: error: ld returned 1 exit status 

ich für Rust Compiler-Direktiven gesucht haben, das Ausgabeformat ändern würde, aber ich konnte keine finden. Ich habe Ruts FFI-Dokumente gelesen, aber nichts dergleichen. Normalerweise geht es bei Informationen darum, C von Rust aus anzurufen. Rust zu bitten, ASM-Dateien zu erzeugen und mit GCC's as zu assemblieren, funktioniert anscheinend nicht, wegen inkompatibler Syntax.

Ist das ein Kompatibilitätsproblem mit der Windows-Version von Rust/GCC? Gibt es etwas, was ich tun kann, um kompatible Objektdateien von Rust zu generieren? Oder welche Art von Output sollte ich Rust zu generieren, um dies zu ermöglichen? Ich bin auch daran interessiert, Rust-Code von C auf einer Vielzahl von SDKs für Spielekonsolen anzurufen. Welche Art von Setup benötige ich, um die Kompatibilität mit anderen Linkern zu maximieren?

+3

Dinge zu überprüfen: 1. Hat Ihr GCC standardmäßig auf 64-Bit- oder 32-Bit (versuchen -m64' explizit '-m32' oder' Hinzufügen)? 2. Richtet Ihr Rust-Compiler 64-Bit oder 32-Bit? 3. [Verwendet Ihr installierter Rust-Compiler den GNU ABI oder den MS ABI] (https://www.rust-lang.org/downloads.html#win-foot)? –

Antwort

3

funktioniert gut für mich:

$ 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 
+0

Es scheint, das Problem war, dass GCC veraltet ist. Ich habe zu einem 6.1.0 Build gewechselt, den ich unter https://nuwen.net/micingw.html gefunden habe und jetzt funktioniert alles! MinGW hat seine GCC-Version immer noch nicht aktualisiert; Ist es noch erhalten? In diesem Zusammenhang, welchen GCC-Port verwenden Sie unter Windows? – HLorenzi

+0

@HLorenzi Ich habe einfach 'Pacman -S gcc', IIRC verwendet. – Shepmaster