一、前言
rust中多了很多类型的库,比如前面章节中我们提到基本的bin与lib这两种crate类型库。
如果你在命令行执行下列语句:
rustc --help
那么你将能找到这样的内容:
--crate-type [bin|lib|rlib|dylib|cdylib|staticlib|proc-macro]
上面的rustc是rust中用来编译代码的工具,当我们运行cargo build命令的时候,该命令底层会使用rustc去构建源码、编译为可执行文件。
比如你只有一个main.rs文件,那么可以这样执行:rustc main.rs,将该文件编译为可执行文件。
然后我们可以看到,在rust中crate的类型是非常多的:
- bin:二进制可执行文件,必须要有main函数作为入口
- lib:它是一种代理名称,指代后续所有类型的库,但其默认指代的是rlib
- rlib:rust专用的静态中间库格式,其用于纯rust项目库互相调用,比如bin中调用lib的crate内部函数,也是我们用的最多的一个类型。
- dylib:动态库,会生成相应的特定于系统的动态库文件,比如linux上为
.so
,MacOs上为.dylib
,Windows上为.dll
,但这类动态库只能被rust写的程序调用。 - cdylib:c语言规范的动态库,也会生成.so、.dylib、.dll等特定于系统的动态库文件,但其会符合C语言规范,可以被其它语言调用,比如C/C++。
- staticlib:将编译为静态库文件,比如linux与mac上的.a文件,又或者windows上的.lib文件。
- proc-macro:专用于导出过程宏的库
二、库生成
下一步,我们来使用一下上面这些列举出来的类型库。
bin类型就不用多说了,我们直接来到后面的lib类型,首先用下面这条命令生成一个lib:
cargo new testlib --lib
此时该项目将为默认的rlib
类型库,比如当我们构建它时:
就会生成rlib
文件,这种文件不需要我们理会,因为这是rust特定的库格式文件,我们一般只需要在其它项目中引入该项目源码进行使用,至于编译链接库的过程则全部交由编译器去处理。
然后下一步我们来看一下其它类型库的编译方式,其实很简单:
你只需要添加一个配置项即可完成编译。
其它类型也是类似的,将这里的crate-type
的值改为对应类型即可,非常简单。
三、库使用
对于rlib与dylib这两种类型的crate,都无需我们操心,因为其使用方法都是基于源码形式使用的。