RUST网络客户端的基本技术说明-库的使用

一、库

学习过当前主流的开发语言的同学们,一定会接触过库,无论是火得不行的Python还是老的掉牙的VB,老当益壮的C/C++,还是互联网的Java,go,离开库,他们啥都不是。一定要把库和框架分清楚,库和框架有时候儿就是不好说明白。库一般来说是组成框架的一个单元或者说一个基础模块,而有些中小的框架可能就是一个库或者几个库。另外还要把包、模块和库分清楚,包和模块是一个逻辑上的概念,而库可能是包和模块的组合体。可以把库理解成一个应用编程上的单元或者从开发角度上的一个基础程序。
在Rust中,包是老大,库是老二,模块是老三,逻辑上依次包含。具体的语言具体分析,这个不用纠结,就和自己盖房子一样,盖成啥样,你觉得满意就是满意,不用在乎别人的看法。

二、Rust的库

Rust中crate就是二进制项目或者库的标识。这句话是啥意思?意思就是说crate是包,但是它可以编译成库。新手可能会有点小糊涂,不过无所谓,知道怎么用就可以了。Rust要求一个包中有且必须只能有一个库,但可以有多个二进制的项目,注意不要和开头的分析弄混,这是Rust中的具体的要求。
对C/C++有了解的程序员都知道,c++为了提供重载机制在编译期引入了改名机制,同样Rust也是如此,这个非常重要,特别是在库中,如果不加以控制,很容易造成编译错误。Rust中同样为了保证名称的一致性即强制不更改,引入了#[no_mangle]这个属性修饰符,有点类似于extern "C”。诸如下面的代码:

#[no_mangle]
extern "C" fn test() {}

三、具体实例

1、创建一个库

cargo new --lib testlib   

这个命令会创建一个创建了 Cargo.toml,里面会以树形结构产生一系列的文件夹和文件。lib默认是生成rlib,lib在Rust中是指一系列的库的一个统称。包括:
rlib:Rust Library 特定静态中间库格式。
dylib:平台相关的动态库,so,dll等。
cdylib:C规范的动态库。
staticlib:静态库
编写代码,在生成的lib.rs:

pub fn testHello() {
    println!("my hello!");
}

再看一下toml文件:

[package]
name = "hello"
version = "0.1.0"
authors = ["fpcfjf <jinfeng.fan@imcore.com>"]
edition = "2018"
[lib]
name = "testlib"
crate-type = ["dylib"]

[lib]项是由可以按照上面的种类进行配置的,如果去除这个,会发现和bin没有什么区别。另外还有两种方法可以创建相关的库:
a、在文件头加上#![crate_type = “xxx”], 其中xxx的可以是bin, lib, rlib, dylib, staticlib.分别对应可执行文件。

//lib.rs
#![crate_type = "lib"]
#![crate_name = "mylib"]
pub fn testp() {
    println!("this is lib");
}

b、编译时给rustc 传–crate-type参数,同上种类类型。

2、编译

使用下面的命令进行编译:

cargo   build[run]    --package  testlib

如果是可执行文件就可以使用run参数,直接编译并运行,后面的包编译选项是可选的。target的目录下就会产生相关的库文件。所以说这个还用集成的IDE开发比较好,至于哪款IDE更好,根据自己的口味去选择就可以了。

3、库的调用
产生的库根据不同的平台的库的调用方式应用就可以了,比如DLL,SO,LIB的调用规范。这里只给出rlib的调用方式,其实很简单:

// 导入testlib
extern crate testlib;

fn main() {
    println!("Hello  world!");
    // 调用rlib函数
    testlib::testHello();
}

注意导入库的位置即可。在toml文件中:

[dependencies]
testlib = { path = "../testlib"}

四、总结

搞这种东西特别费时间,不是技术问题,是对rust中对库的各种调用方式及编译场景的不熟悉导致的,应用的少就会不断有这种问题,即使会了,过一段时间又会重复这种事儿。所以才有“学而时习之”的痛苦。
努力吧,归来的少年!
在这里插入图片描述

使用 GTK-rs 需要先安装 GTK+3,可以在 Linux 系统下通过包管理器安装,也可以在 Windows 和 macOS 下从官网下载安装程序进行安装。 安装 GTK+3 后,可以在 Rust 项目中添加 gtk 和 gdk 两个依赖: ```toml [dependencies] gtk = "0.9" gdk = "0.9" ``` 然后在 Rust 代码中引入 gtk 和 gdk : ```rust extern crate gtk; extern crate gdk; ``` 在 GTK-rs 中,主要有两种方式创建 GUI 窗口:Builder 和手动创建。下面分别介绍这两种方式。 ### 使用 Builder 创建 GUI 窗口 使用 Builder 可以通过 XML 文件描述 GUI 界面,然后使用 Rust 代码加载并显示窗口。以下是一个简单的例子: ```xml <?xml version="1.0" encoding="UTF-8"?> <interface> <object class="GtkWindow" id="main_window"> <property name="title">Hello, World!</property> <property name="default-width">400</property> <property name="default-height">300</property> <child> <object class="GtkLabel" id="label"> <property name="label">Hello, World!</property> </object> </child> </object> </interface> ``` 在 Rust 代码中,可以使用 gtk::Builder 加载并显示窗口: ```rust use gtk::prelude::*; use gtk::{Builder, Window}; fn main() { if let Err(err) = gtk::init() { eprintln!("Failed to initialize GTK: {}", err); return; } let glade_src = include_str!("path/to/glade/file.glade"); let builder = Builder::from_string(glade_src); let window: Window = builder.get_object("main_window").unwrap(); window.show_all(); gtk::main(); } ``` ### 手动创建 GUI 窗口 手动创建 GUI 窗口需要在 Rust 代码中定义窗口和窗口中的组件,以下是一个简单的例子: ```rust use gtk::prelude::*; use gtk::{Window, WindowType, Label}; fn main() { if let Err(err) = gtk::init() { eprintln!("Failed to initialize GTK: {}", err); return; } let window = Window::new(WindowType::Toplevel); window.set_title("Hello, World!"); window.set_default_size(400, 300); let label = Label::new(Some("Hello, World!")); window.add(&label); window.show_all(); gtk::main(); } ``` 以上代码中,创建了一个顶层窗口和一个标签组件,将标签添加到窗口中并显示窗口。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值