链接外部crate

从crate创建库

首先创建一个create文件app.rs

  1. pub fn init() {
  2. println!("call init");
  3. }

先把这个crate文件编译为库,此时rustc命令需要指定--crate-type=lib

  1. $ rustc --crate-type=lib app.rs
  2. $ ls lib*
  3. libapp.rlib

可以看到输入的文件app.rs在编译之后会得到一个名为libapp.rlib的文件。

编译目标文件的命名规则:

  1. 默认为编译文件加上lib前缀。

  2. 默认在lib后面加上crate文件的名字

  3. 可以通过crate_name属性来覆盖默认规则

详细内容参考crate属性

链接到当前crate

通过extern crate声明来将外部crate链接进当前crate。然后就可以通过crate的名字调用它的public方法:

  1. extern crate app;
  2. fn main() {
  3. app::init();
  4. }

可以在链接时为crate取一个别名,然后通过别名来调用:

  1. extern crate app as myapp;
  2. fn main() {
  3. myapp::init();
  4. }

crate名称中的分隔符

这是新人入门容易遇到的一个小坑。

Cargo.toml文件的内容,这里定义的name是”conduit-proxy”,注意是分隔符是中划线:

  1. [package]
  2. name = "conduit-proxy"

这个name就是lib.rs的crate name。在main.rs中,需要使用这个name来调用lib.rs的内容:

  1. extern crate conduit_proxy;
  2. fn main() {
  3. ......
  4. conduit_proxy::Main::new(config).run();
  5. }

注意这里的是”conduit_proxy”,分隔符是下划线,和上面的”conduit-proxy”中划线不同。

这里的规则是:

  1. 代码中必须使用下划线/“conduit_proxy”

    中划线”conduit-proxy”在代码中直接编译失败,因为”-“/中划线在rust中是特殊字符。

  2. cargo.toml文件中name推荐使用中划线”conduit-proxy”

    rust会做好名字的对应,中划线”conduit-proxy”的name,在代码中用下划线”conduit_proxy”做调用。

    当然,如果将name设置为下划线”conduit_proxy”,和代码保持一直,也是可以的。

rust官方的参考资料: