Hubungkan program karat dasar ke rlib di subfolder

Aug 30 2020

Ini adalah percobaan pertama saya pada karat, saya berasal dari latar belakang c ++ dan mencoba untuk memulai. Jadi saya mulai membuat proyek saya di folder bernama.../rust/

Catatan: Saya menggunakan tautan ini untuk memulai dengan alat:https://medium.com/@wizofe/cross-compiling-rust-for-arm-e-g-raspberry-pi-using-any-os-11711ebfc52b

  • Saya telah menciptakan program default karat menggunakan: cargo new --bin rust_test. Ini menciptakan .../rust/rust_test.
  • Saya dapat membangun menggunakan: cargo buildatau cargo build --target=armv7-unknown-linux-gnueabihf(untuk BeagleBB saya)

Sejauh ini bagus. Sekarang saya ingin membuat perpustakaan yang dapat saya bagikan dengan proyek lain. Tapi saya akan membuatnya di dalam folder rust_test sebagai .../rust/rust_test/utils:

  • Membuat perpustakaan dengan: cargo new --lib utils
  • Saya dapat membangun utilitas saya di samping utilsdir dengan cargo build:, ini menghasilkan file .rlib.
  • Sekarang saya ingin mendapatkan proyek rust_test saya untuk membangunnya sebagai dependensi, saya menemukan saya hanya perlu menambahkan: utils = { path = "utils" }ke file rust_test .toml saya.
  • Sekarang saya dapat membuat file rust_test yang dapat dieksekusi dan lib utils saya di folder rust_test dengan cargo build

Sekali lagi, sejauh ini semuanya baik-baik saja. Bagian terakhir dari teka-teki bagi saya adalah menggunakan fungsi dalam perpustakaan utilitas saya. Ada dua fungsi di sana. Satu dipanggil adder(a,b)- upaya pada fungsi templat, dan fungsi dasar dipanggil test123(). Di sinilah saya terjebak. Sepertinya saya tidak dapat merumuskan sintaks yang benar untuk memanggil salah satu fungsi ini.

Ini file utama saya:

karat_test

lokasi: .../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
}

utilitas

lokasi: .../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!");
    }
}

Hasil

~/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`.

Saya harus mengakui bahwa saya tidak begitu mengerti apa yang dilakukan garis #[cfg...]dan #[...]. Tapi dari apa yang telah saya baca, saya pikir mod utils;in main.rs memberitahu karat compiler / linker untuk mencari tempat lain untuk fungsi test123 ().

Mungkin saya bahkan belum menautkan file sama sekali - saya hanya membuatnya?

Jadi pertanyaannya adalah apa yang harus saya lakukan sekarang untuk menautkan perpustakaan saya ke aplikasi saya sehingga saya dapat menggunakan fungsi lib test123()?

memperbarui

jika saya menghapus mod utils;saya mendapatkan kesalahan:

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`.

Jawaban

1 prog-fh Aug 30 2020 at 12:15

Saya pikir menyingkirkan mod utils;dalam main.rsseharusnya menyelesaikan masalah Anda.

mod utils;in main.rsmemberi tahu kompilator yang utilsmerupakan modul dalam aplikasi Anda (tetapi tidak ada sehingga tidak berisi fungsi yang Anda cari), meskipun sebenarnya ini adalah sebuah peti (di luar aplikasi Anda).

Sistem modul membantu mengatur detail di dalam peti sementara peti dipandang sebagai perpustakaan.


edit

Anda juga harus menyingkirkan #[cfg(utils)]in lib.rskarena itu berarti item berikut hanya ada jika utilsfitur tersebut disetel di Cargo.tomlfile Anda (yang tidak terjadi). The cfg()arahan dimaksudkan untuk kompilasi bersyarat. (https://doc.rust-lang.org/reference/conditional-compilation.html )

Dan maaf, saya lupa, mod utils {}di lib.rsmungkin tidak diperlukan, atau Anda akan perlu merujuk ke fungsi sebagai utils::utils::test123()dari aplikasi Anda. Yang pertama utilsmengacu pada peti, yang kedua utilsmengacu pada modul bagian dalam peti ini.