我之前写过一篇文章《基于 Tauri + React + Rust + libusb + ESC/POS 驱动打印机蜂鸣器》,有网友评论说:
现在又卡在了link上,无法打开输入文件usb-1.0.lib
然后我在自己的电脑也复现了,但之前安装环境是稀里糊涂地装了一遍,有些地方是不清楚原理的。
趁着今天休息的时间,在家里的电脑重新装了一遍。我只记录了一些我疑惑的点。
具体如何安装的软件见文章底部的参考
部分列出的链接。
需要的软件
Rust 工具集。
rustup
是 Rust 工具链的安装程序和更新程序。Cargo
是 Rust 包管理工具的名称。rustc
是 Rust 编译器。大多数情况下,你不会直接调用rustc
,而是通过Cargo
间接调用它。
MSYS2
Mingw(Minimalist GNU for Windows)是一个开发工具集,提供了用于 Windows 环境下编译和运行 C、C++ 等程序的工具链。
Mingw-w64 是 Mingw 的一个分支,专注于支持 64 位 Windows 系统。它提供了对 64 位 Windows 环境下各种 API 的支持。
Msys(Minimal System)是一个轻量级的类 Unix 环境,它提供了一些基本的 Unix 工具和 shell 环境,用于在 Windows 系统上运行 Unix 程序。
Msys2 是 Msys 的一个升级版,它提供了更丰富的软件包管理系统和更新的工具链,使得在 Windows 系统上使用Unix 程序变得更加方便。
Cygwin 是另一个类 Unix 环境,它提供了一套完整的 GNU 工具链和一些 Unix 系统调用的实现,使得在 Windows 系统上可以运行大部分的 Unix 程序。
这些工具之间的关系是:
Mingw 和 Mingw-w64 提供了用于编译和运行 C、C++ 等程序的工具链;
Msys 和 Msys2 提供了在 Windows 系统上运行 Unix 程序所需的环境和工具;
Cygwin 则提供了一套完整的 GNU 工具链和 Unix 系统调用的实现,使得在 Windows 系统上可以运行大部分的Unix 程序。
Msys 和 Msys2 都是基于 Cygwin 开发的,但它们的目标不同,Msys 和 Msys2 更加轻量级且专注于提供基本的Unix 环境和工具,而 Cygwin 则更加完整和强大。
pkg-config
pkg-config 是一个用于管理编译和链接时的依赖库的工具。它可以帮助开发人员在编译和链接时自动查找和配置所需的库文件和头文件。
libusb
用于访问 USB 设备的跨平台库。
最后来一张图:
安装好以上的软件后。
检查一下软件信息
rust 相关
$ rustup --version
rustup 1.26.0 (5af9b9484 2023-04-05)
info: This is the version for the rustup toolchain manager, not the rustc compiler.
info: The currently active `rustc` version is `rustc 1.74.1 (a28077b28 2023-12-04)
$ cargo --version
cargo 1.74.1 (ecb9851af 2023-10-18)
$ rustup toolchain list
stable-x86_64-pc-windows-gnu (default)
stable-x86_64-pc-windows-msvc
可以看出 rust 我是基于 GNU 工具链
来编译的。安装 gnu 工具链
,可以通过命令 rustup toolchain install stable-gnu
;
如果要安装 msvc 工具链
,则 rustup toolchain install stable-msvc
设置默认工具链 rustup default stable-gnu
MSYS2
Mingw-w64
所在目录:C:\msys64\mingw64
$ pkg-config --cflags --libs libusb-1.0
-IC:/msys64/mingw64/include/libusb-1.0 -LC:/msys64/mingw64/lib/libusb-1.0/static -lusb-1.0
请确保你电脑安装好这些软件,如果没有,请参考参考
列出的链接。
配置 libusb
这里主要参考 Rust USB 开发|前尘逐梦
- 下载 libusb 编译好的包。我下载的是
libusb-1.0.20.7z
- 解压后,进入
libusb-1.0.20
目录。 - 复制
include
下的libusb-1.0
文件夹到C:\msys64\mingw64\include
下。 C:\msys64\mingw64\include
下新建libusb-1.0
。- 复制
MinGW64
下的dll
和static
文件夹到C:\msys64\mingw64\include\libusb-1.0
。 C:\msys64\mingw64\lib\pkgconfig
下新建libusb-1.0.pc
libusb-1.0.pc
内容,静态链接 libusb
prefix=c:\msys64\mingw64
exec_prefix=${prefix}
includedir=${prefix}/include/libusb-1.0
libdir=${prefix}/lib/libusb-1.0/static
Name: libusb
Description: libusb
Version: 1.0
Cflags: -I${includedir}
Libs: -L${libdir} -lusb-1.0
测试验证
创建 rust 项目
cargo new libusb-demo
cd libusb-demo
cargo add libusb
code .
调用 libusb
// src/main.rs
extern crate libusb;
fn main() {
let context = libusb::Context::new().unwrap();
for device in context.devices().unwrap().iter() {
let device_desc = device.device_descriptor().unwrap();
println!(
"Bus {:03} Device {:03} ID {:04x}:{:04x}",
device.bus_number(),
device.address(),
device_desc.vendor_id(),
device_desc.product_id()
);
}
}
运行
$ cargo run
Finished dev [unoptimized + debuginfo] target(s) in 0.01s
Running `target\debug\libusb-demo.exe`
Bus 001 Device 002 ID 413c:2113
Bus 001 Device 001 ID 413c:301a
Bus 001 Device 002 ID 0bda:c829
Bus 001 Device 000 ID 8086:7ae0