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?
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)? –