Vincular el programa rust básico a rlib en una subcarpeta

Aug 30 2020

Este es mi primer intento de oxidación, soy de c ++ y estoy tratando de ponerme en marcha. Entonces comencé a crear mi proyecto en una carpeta llamada.../rust/

Nota: utilicé este enlace para comenzar con las herramientas:https://medium.com/@wizofe/cross-compiling-rust-for-arm-e-g-raspberry-pi-using-any-os-11711ebfc52b

  • He creado el programa predeterminado mediante la oxidación: cargo new --bin rust_test. Esto crea .../rust/rust_test.
  • Puedo construir usando: cargo buildo cargo build --target=armv7-unknown-linux-gnueabihf(para mi BeagleBB)

Hasta aquí todo bien. Ahora quiero crear una biblioteca que pueda compartir con otros proyectos. Pero lo crearé dentro de la carpeta rust_test como .../rust/rust_test/utils:

  • Creó la biblioteca con: cargo new --lib utils
  • Puedo construir mis utilidades en el lado del utilsdirectorio con:, cargo buildesto genera un archivo .rlib.
  • Ahora quería que mi proyecto rust_test lo construyera como una dependencia, descubrí que solo tenía que agregar: utils = { path = "utils" }a mi archivo rust_test .toml.
  • Ahora puedo construir mi ejecutable rust_test y mi lib de utils en la carpeta rust_test con cargo build

De nuevo, todo bien hasta ahora. La parte final del rompecabezas para mí es usar la función dentro de mi biblioteca de utilidades. Hay dos funciones ahí. Uno llamado adder(a,b): un intento de una función de plantilla y una función básica llamada test123(). Aquí es donde me he quedado atascado. Parece que no puedo formular la sintaxis correcta para llamar a ninguna de estas funciones.

Aquí están mis archivos principales:

prueba_herrumbre

ubicación: .../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
}

utils

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

La salida

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

Tengo que admitir que no entiendo realmente qué hacen las líneas #[cfg...]y #[...]. Pero por lo que he leído, pensé que mod utils;en main.rs le dice al compilador / enlazador de rust que busque en otro lugar la función test123 ().

Tal vez ni siquiera he vinculado los archivos todavía, ¿solo los he creado?

Entonces, la pregunta es ¿qué debo hacer ahora para vincular mi biblioteca a mi aplicación para poder usar la función lib test123()?

actualizar

si elimino mod utils;me sale el error:

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

Respuestas

1 prog-fh Aug 30 2020 at 12:15

Creo que deshacerse de mod utils;adentro main.rsdebería resolver su problema.

mod utils;in main.rsle dice al compilador que utilses un módulo interno de su aplicación (pero no existe, por lo que no contiene las funciones que está buscando), aunque en realidad es una caja (externa a su aplicación).

El sistema de módulos ayuda a organizar los detalles dentro de una caja, mientras que una caja se ve como una biblioteca.


editar

También debe deshacerse de #[cfg(utils)]in lib.rsporque significa que el siguiente elemento existe solo si la utilsfunción está configurada en su Cargo.tomlarchivo (que no es el caso). Las cfg()directivas están destinadas a la compilación condicional. (https://doc.rust-lang.org/reference/conditional-compilation.html )

Y lo siento, se me olvidaba, mod utils {}en lib.rspuede no ser necesario, o tendrá que hacer referencia a la función como utils::utils::test123()desde la aplicación. El primero se utilsrefiere a la caja, el segundo se utilsrefiere a un módulo interior de esta caja.