Bir alt klasörde temel pas programını rlib'e bağlayın

Aug 30 2020

Bu pass'a ilk denemem, c ++ geçmişinden geliyorum ve başlamaya çalışıyorum. Bu yüzden projemi bir klasörde oluşturmaya başladım.../rust/

Not: Araçlara başlamak için bu bağlantıyı kullandım:https://medium.com/@wizofe/cross-compiling-rust-for-arm-e-g-raspberry-pi-using-any-os-11711ebfc52b

  • Ben kullanarak varsayılan pas programı oluşturduk: cargo new --bin rust_test. Bu yaratır .../rust/rust_test.
  • Kullanarak inşa edebilirim: cargo buildveya cargo build --target=armv7-unknown-linux-gnueabihf(BeagleBB'm için)

Çok uzak çok iyi. Şimdi diğer projelerle paylaşabileceğim bir kitaplık oluşturmak istiyorum. Ama bunu rust_test klasörünün içinde şu şekilde oluşturacağım .../rust/rust_test/utils:

  • Kitaplığı şununla oluşturdu: cargo new --lib utils
  • Yanında benim utils'i inşa edebilirsiniz utilsile dir: cargo buildBu bir .rlib dosyası oluşturur.
  • Şimdi rust_test projemi bir bağımlılık olarak inşa etmek istedim, sadece utils = { path = "utils" }şunu eklemem gerektiğini buldum: rust_test .toml dosyama.
  • Şimdi rust_test yürütülebilir dosyamı ve utils lib'imi rust_test klasöründe şu şekilde oluşturabilirim: cargo build

Yine, şimdiye kadar hepsi iyi. Bulmacanın benim için son kısmı, işlevi utils kitaplığımdaki kullanmaktır. Orada iki işlev var. Biri çağrılır adder(a,b)- bir şablon işlevinde bir deneme ve adı verilen temel bir işlev test123(). Burada takılıp kaldığım yer burası. Bu işlevlerden herhangi birini çağırmak için doğru sözdizimini formüle edemiyorum.

İşte ana dosyalarım:

rust_test

yer: .../rust/rust_test/

Cargo.toml

[package]
name = "rust_test"
version = "0.1.0"
authors = ["[email protected] <[email protected]>"]
edition = "2018"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]
utils = { path = "utils" }

main.rs

mod utils;

fn main() {
    println!("Hello, world!");

    utils::test123();    // ??? - does not work
}

aletler

yer: .../rust/rust_test/utils/

Cargo.toml

[package]
name = "utils"
version = "0.1.0"
authors = ["[email protected] <[email protected]>"]
edition = "2018"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]

lib.rs

#[cfg(test)]
mod tests {
    #[test]
    fn adder<T>(a: T, b: T) -> T {
        return a + b;
    }
}

#[cfg(utils)]
mod utils {
    #[utils]

    fn test123() {
        println!("test!");
    }
}

Çıktı

~/bbb/development/rust/rust_test$ cargo build
   Compiling rust_test v0.1.0 (/home/user/bbb/development/rust_test)
error[E0583]: file not found for module `utils`
 --> src/main.rs:1:1
  |
1 | mod utils;
  | ^^^^^^^^^^
  |
  = help: to create the module `utils`, create file "src/utils.rs"

error[E0425]: cannot find function `test123` in module `utils`
 --> src/main.rs:6:12
  |
6 |     utils::test123();    // ??? - does not work
  |            ^^^^^^^ not found in `utils`

error: aborting due to 2 previous errors

Some errors have detailed explanations: E0425, E0583.
For more information about an error, try `rustc --explain E0425`.
error: could not compile `rust_test`.

#[cfg...]Ve #[...]satırlarının ne işe yaradığını gerçekten anlamadığımı itiraf etmeliyim . Ama okuduğum kadarıyla mod utils;ana.rs'nin pas derleyicisine / bağlayıcısına test123 () işlevi için başka bir yere bakmasını söylediğini düşündüm .

Belki henüz dosyaları birbirine bağlamadım - sadece onları oluşturdum?

Öyleyse soru, kitaplığımı uygulamama bağlamak için şimdi ne yapmam gerektiği, böylece lib işlevini kullanabilir miyim test123()?

Güncelleme

kaldırırsam mod utils;şu hatayı alırım:

user@user-VirtualBox:~/bbb/development/rust/rust_test$ cargo build
   Compiling rust_test v0.1.0 (/home/user/bbb/development/rust_test)
error[E0425]: cannot find function `test123` in crate `utils`
 --> src/main.rs:4:12
  |
4 |     utils::test123();    // ??? - does not work
  |            ^^^^^^^ not found in `utils`

error: aborting due to previous error

For more information about this error, try `rustc --explain E0425`.
error: could not compile `rust_test`.

Yanıtlar

1 prog-fh Aug 30 2020 at 12:15

Ben kurtulmak düşünüyorum mod utils;içinde main.rssorunu çözmek gerekir.

mod utils;in main.rs, derleyiciye utilsuygulamanızın iç modülü olduğunu söyler (ancak mevcut değildir, dolayısıyla aradığınız işlevleri içermez), ancak aslında bir sandıktır (uygulamanızın dışında).

Modül sistemi, bir sandık bir kitaplık olarak görülürken, bir sandık içindeki ayrıntıları düzenlemeye yardımcı olur.


Düzenle

Ayrıca kurtulmak gerektiğini #[cfg(utils)]de lib.rsaşağıdaki madde halinde bulunduğunu ifade eder, çünkü utilsözelliği ayarlanır Cargo.toml(vaka değil) dosyası. cfg()Direktifler koşullu derleme için tasarlanmıştır. (https://doc.rust-lang.org/reference/conditional-compilation.html )

Ve üzgünüm, ben unuttum, mod utils {}içinde lib.rsgerekli olmayabilir veya aynı işleve başvurmak gerekir utils::utils::test123()uygulamanızdan. Birincisi utilskasaya, ikincisi utilsbu kasanın iç modülüne atıfta bulunur.