21. rust与动静态库的结合使用

一、前言

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类型库,比如当我们构建它时:

image.png

就会生成rlib文件,这种文件不需要我们理会,因为这是rust特定的库格式文件,我们一般只需要在其它项目中引入该项目源码进行使用,至于编译链接库的过程则全部交由编译器去处理。

然后下一步我们来看一下其它类型库的编译方式,其实很简单:

image.png 你只需要添加一个配置项即可完成编译。

其它类型也是类似的,将这里的crate-type的值改为对应类型即可,非常简单。

三、库使用

对于rlib与dylib这两种类型的crate,都无需我们操心,因为其使用方法都是基于源码形式使用的。

作者:余识
全部文章:0
会员文章:0
总阅读量:0
c/c++pythonrustJavaScriptwindowslinux