2015-01-19 7 views
5

Mit etwas Mühe Kompilieren Rust immer auf der Core-Bibliothek auf OS X zu verbinden i686-unknown-linux-gnu-Targeting:kann nicht Kernbibliothek verknüpfen gegen wenn Quer

MacBook:rustboot alex$ make 
rustc -O --target i686-unknown-linux-gnu --crate-type lib -o main.o --emit obj main.rs 
main.rs:5:1: 5:19 error: can't find crate for `core` 
main.rs:5 extern crate core; 
      ^~~~~~~~~~~~~~~~~~ 
error: aborting due to previous error 
make: *** [main.o] Error 101 

main.rs sieht wie folgt aus:

Ich vermute, dass es ist, weil ich versuche, zu i686-unknown-linux-gnu zu verbinden, aber die Kernbibliothek existiert nicht für diese Plattform. Wie installieren oder erstellen Sie die Bibliotheken für diese Plattform?

+1

Um klar zu sein, Sie versuchen, bewusst von OS X auf Linux kompilieren zu überqueren? – Shepmaster

+0

Ich versuche, kompilieren, um meinen eigenen Spielzeugkern zu schreiben, basierend auf dem Code hier: https://github.com/charliesome/rustboot Ich versuche Libcore zu kompilieren. Der obige Code ist der minimale Code, der das Problem hervorhebt. Ich werde versuchen, aus der Quelle mit ./configure zu bauen - target = i686-unknown-linux-gnu – zander

Antwort

9

Dies wird durch die Core-Bibliothek verursacht, die für die gewünschte Plattform nicht existiert. Es gibt ein paar Möglichkeiten, man es erwerben könnten:

  • Verwendung rustup-rustup target add i686-unknown-gnu-linux sollte den Trick
  • bekommen cargo tun, indem sie die ganze harte Arbeit zu tun, das Hinzufügen core-nightly zu Ihrem Cargo.toml und cargo build --target=... verwenden. Leider scheint es für eine Weile nicht aktualisiert worden zu sein, aber man kann ein lokales Paket machen, indem man src/libcore aus the Rust repo kopiert, eine Cargo.toml hinzufügt und eine path Abhängigkeit verwendet; in Zukunft wird es wahrscheinlich auch offiziell über crates.io bereitgestellt werden, aber ich habe keine Ahnung, wie weit das entfernt ist.
  • herunterladen ein Rust für Ihre gewünschte Ziel (zB die corresponding nightly auf die, die Sie installiert haben) bauen, extrahieren Sie die lib/rustlib/ Verzeichnis irgendwo entweder automatisch durchsucht (~/.multirust/toolchains/nightly-2015-01-18/lib/rustlib) oder an jedem Ort und passieren eine -L Flagge an den Compiler (Ich bin nicht 100% sicher an der genauen Stelle, auf die die -L Flagge zeigen sollte, obwohl).
  • Quer kompilieren Rust selbst: Kasse den Repo, ./configure --target=$yourtarget und dann make sollten Sie einen Compiler bauen, die auf Ihrem aktuellen Computer ausgeführt werden können, sondern auch Binärdateien erstellen, die
  • tun manuelle Querübersetzbarkeit der auf Ihrem gewünschten Ziel führen Kisten, die Sie brauchen, z zinc.rs verwendet eine Rakefile, die alles baut, was sie wollen

Die Fracht Route ist definitiv die einfachste im Moment. Die Cross-Compiling-Geschichte wird in Zukunft definitiv einfacher, z.B. machen multirust machen alle komplizierten Bits für die dritte Möglichkeit. Sowohl der dritte als auch der vierte Weg beruhen jedoch darauf, std für Ihre Plattform zu erstellen, was für die Kernel-Arbeit unwahrscheinlich erscheint.

(BTW, die rlibc Kiste ist sinnvoll/notwendig für zu Kernel-Arbeit.)

+1

Es funktioniert! Die Nacht heruntergeladen und den Ordner rustc-night-i686-unbekannt-linux-gnu/lib/rustlib/i686-unbekannt-linux-gnu nach/usr/local/lib/rustlib kopiert und verlinkt. Danke für Ihre Hilfe. – zander

+0

Siehe auch diese Fragen, die auf [cargo] (https://github.com/rust-lang/cargo/issues/2158) und [multirost] (https://github.com/brson/multirust/issues/20) angesprochen wurden. –

+0

Ein anderer Platz, um libcore zu platzieren, ist '$ YOUR_PROJECT/.rust/lib/target.json/libcore.rlib', und die Fracht wird glücklich sein. –

Verwandte Themen