2016-08-26 3 views
10

Ich habe die folgende VerzeichnisstrukturWie importieren Sie Makros in Submodule in Rust?

  • /main.rs
  • /lib.rs
  • /tutorial/mod.rs
  • /tutorial/foo.rs

In foo.rs Ich brauche einen Makro aus der glium Bibliothek zu verwenden, implement_vertex!. Wenn ich an der Spitze von foo.rs setze, bekomme ich eine error: an `extern crate` loading macros must be at the crate root. Ich bekomme auch eine error: macro undefined: 'implement_vertex!'

Es gibt auch eine lib.rs das ist die Kiste Wurzel der Tutorial-Module. Ich musste #[macro_use] dort setzen. Erzeugt das 2 Kistenwurzeln, wenn ich sowohl main.rs als auch lib.rs habe?

Was ist der richtige Weg, um Makros in einem Submodul zu importieren?

+2

Ohne tatsächlichen Code kann dies nur durch blindes Raten gelöst werden. Alles, was wir brauchen, ist die Struktur, wo sie importiert wird und wo sie verwendet wird. –

+0

Wie kompilieren Sie ('cargo build')? Hast du dein 'Cargo.toml' modifiziert? In welcher Datei befindet sich die Zeile 'mod tutorial;'? In welcher Datei steht die Zeile 'mod foo;'? Ohne diese Informationen können wir nur raten, wie Ihr Modulbaum aussieht, wie @DK. bereits gesagt. –

Antwort

2

Do it wie der Compiler Sie sagte:

an `extern crate` loading macros must be at the crate root

die #[macro_use] extern crate glium; in der Kiste Wurzel Put, die main.rs in Ihrem Fall ist. Stellen Sie sicher, dass die Anweisung extern crate vor Ihren mod Anweisungen steht, andernfalls können die Module nicht auf die importierten Makros zugreifen.

Sie können dann das Makro in Ihrem Submodul verwenden.

+0

Ja, das ist das erste, was ich ausprobiert habe. Es hat nicht funktioniert. Ich bekomme immer noch Fehler: Makro undefiniert: 'implementieren_vertex!' – jz87

+1

Stelle sicher, dass die "extern crate" -Anweisung vor deinen 'mod'-Anweisungen steht, sonst können die Mods nicht auf die importierten Makros zugreifen. – durka42

+4

@ durka42 Führt immer noch zum selben Fehler. – Zelphir

6

Makros werden früh genug in der Kompilierungsstufe behandelt, dass Bestellung Angelegenheiten. Sie, wie ich, wurden wahrscheinlich nett und gewöhnten sich an Rust und mähten die Notwendigkeit weg, sich um die Reihenfolge Ihrer Verwendung und der Kistenaussagen zu kümmern.

Verschieben Sie Ihre Anweisung an den Anfang Ihrer lib.rs und/oder main.rs Datei wie benötigt.

0

Ich habe mein ursprüngliches Problem herausgefunden. Es stellt sich heraus, dass es 2 Cargo-Wurzeln gibt? Ich habe sowohl eine lib.rs und eine main.rs. Es stellt sich heraus, der richtige Ort, um die #[macro_use] war die lib.rs.

Verwandte Themen