1.libusb的下载和简单介绍
libusb使用c实现, 具有的跨平台的特性,目前支持的操作系统有:Linux、macOS、Windows、OpenBSD/NetBSD、Haiku、Solaris。
1.1 libusb的github和gitee仓库地址
libusb github仓库
libusb gitee仓库
# 使用git命令下载libusb源码
git clone https://gitee.com/mirrors/libusb.git
1.2 libusb项目目录说明
2.使用Visual Studio 2022 进行编译和开发
- 在windows下使用Visual Studio开发libusb非常方便,libusb/msvc目录提供了Visual Studio 的解决方案。
- 编译后生成的可库存放在 /build(lib|dll)/libusb-1.0.(lib|dll) 例如: /build/v143/x64/Debug/dll/libusb-1.0.dll
- 运行测试工程testlibusb,输出如下,后续开发可基于示例工程,也可仿照示例工程创建新的工程。
3. linux环境下的编译和开发
libusb是一个autotools工程,遵循autotools工程的一般安装流程,即经典三部 ./configure; make && make install, 以ubuntu22.04为例,安装如下依赖:
sudo apt install build-essential autoconf libtool
3.1 libusb下的编译
- 进入libusb目录
- 运行autogen.sh 脚本生成 configure文件。
./autogen.sh
- 运行configure配置项目生成Makefile。
./configure
- 运行make进行编译
make
- 运行make install 进行安装,输出信息描述了库的安装路径和使用方法,使用中系统会到 /usr/local/lib寻找头文件和库文件。
sudo make install
3.2 vscode + VMware + ubuntu22.04
3.2.1 Remote-SSH插件安装与使用
在VMware中ubuntu22.04中安装libusb, 在vscode中使用Remote-SSH远程打开ubuntu22.04中的文件进行开发。
- ubuntu22.04需要开启 ssh 服务,
sudo apt install openssh-server
-
vscod安装 Remote-SSH 插件
3.2.2 tasks.json文件
{
"tasks": [
{
"type": "cppbuild",
"label": "vscode_build",
"command": "/usr/bin/gcc",
"args": [
"${workspaceFolder}/*.c",
"-lusb-1.0",
"-g",
"-o",
"${workspaceFolder}/${workspaceFolderBasename}"
],
"options": {
"cwd": "${workspaceFolder}"
},
"problemMatcher": [
"$gcc"
],
"group": {
"kind": "build",
"isDefault": true
},
"detail": "调试器生成的任务。"
},
{
// 仅仅相当于在命令行中执行了一个make命令
"label": "make_build", // 任务名
"type": "shell", // 在shell中运行
"command": "make", // 在shell中运行make命令
"isBackground": false, // 不需要后台运行,编译完进程结束
},
],
"version": "2.0.0"
}
3.2.3 launch.json文件
{
// 使用 IntelliSense 了解相关属性。
// 悬停以查看现有属性的描述。
// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "(gdb) 启动",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/build/os.elf",
"args": [],
"stopAtEntry": true,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"preLaunchTask": "make_build",
"setupCommands": [
{
"description": "为 gdb 启用整齐打印",
"text": "-enable-pretty-printing",
"ignoreFailures": true
},
{
"description": "将反汇编风格设置为 Intel",
"text": "-gdb-set disassembly-flavor intel",
"ignoreFailures": true
}
]
}
]
}
3.2.4 当前工程使用的通用Makefile记录
3.2.4.1 Makefile 配置文件config.mk
# 指定头文件的路径
INCS_DIR := .
# 指定源文件的路径
SRC_DIR := .
# 指定目标名
TARGET := os
# 指定编译器前缀
CROSS_COMPILE :=
LINK_SCRIPT :=
# 指定编译选项
# CFLAGS := -march=rv32i -mabi=ilp32 -save-temps=obj -g -O0 -Wall -nostdlib -nostdinc -mcmodel=medany -fno-PIE -fomit-frame-pointer
CFLAGS := -g
3.2.4.2 通用Makefile文件
.PHONY : all clean rebuild
include config.mk
# 指定源文件后缀
SRCS_SUFFIX := .c .S
#指定头文件的后缀
INCS_SUFFIX := .h
# 指定依赖文件后缀
DEPS_SUFFIX := .dep
# 指定编译后的目标文件的后缀
OBJS_SUFFIX := .o
# 指定编译生成文件的的根目录名
BUILD_ROOT := build
# 编译要生成的文件夹
BUILD_DIR := $(addprefix $(BUILD_ROOT)/,$(SRC_DIR))
CC := $(CROSS_COMPILE)gcc
LD := $(CROSS_COMPILE)ld
OBJCOPY := $(CROSS_COMPILE)objcopy
OBJDUMP := $(CROSS_COMPILE)objdump
SIZE := $(CROSS_COMPILE)size
CFLAGS += -I $(INCS_DIR)
MKDIR := mkdir
RM := rm -rf
# 路径搜索仅在变量规则解析阶段(比较文件的时间戳,是否存在。。。)起作用,定义变量时不起作用
#VPATH := $(INC_DIR) $(SRC_DIR)
define SRC_PATH_DIR
vpath %$(1) $(SRC_DIR)
endef
define INC_PATH_DIR
#vpath %$(1) $(INCS_DIR)
endef
$(foreach suffix,$(SRCS_SUFFIX),$(eval $(call SRC_PATH_DIR,$(suffix))))
$(foreach suffix,$(INCS_SUFFIX),$(eval $(call INC_PATH_DIR,$(suffix))))
#vpath %$(INCS_SUFFIX) $(INCS_DIR)
SRCS := $(foreach dir,$(SRC_DIR),$(foreach suffix,$(SRCS_SUFFIX),$(wildcard $(dir)/*$(suffix))))
DEPS := $(addprefix build/,$(addsuffix $(DEPS_SUFFIX),$(basename $(SRCS))))
OBJS := $(DEPS:$(DEPS_SUFFIX)=$(OBJS_SUFFIX))
TARGET_BASENAME := $(basename $(TARGET))
all : $(BUILD_ROOT)/$(TARGET)
$(BUILD_ROOT)/$(TARGET) : $(OBJS)
# $(CC) $(LFLAGS) -o $@ $^ -Map $(BUILD_ROOT)/$(TARGET_BASENAME).map
$(CC) $(CFLAGS) $(LINK_SCRIPT) -o $@ $^ -lusb-1.0 -Wl,-Map,$(BUILD_ROOT)/$(TARGET_BASENAME).map
$(OBJCOPY) $@ -O binary $(BUILD_ROOT)/$(TARGET_BASENAME).bin
$(OBJDUMP) -D $@ > $(BUILD_ROOT)/$(TARGET_BASENAME).dis
$(SIZE) $@
# include行为:
# 首先检查此文件是否存在,如果不存在,会检查是否有创建此文件的规则并执行,执行成功后重新include此文件。
# 如果文件存在,依旧检查规则,查看文件是否需要更新,如果要更新,更行后重新include。
# 总结:include行文发生在make读取文件阶段,make会检查include的文件是否存在,且是否是最新的,include总是会包含最新的文件。
include $(DEPS)
$(OBJS) :
$(CC) -c $(CFLAGS) -o $@ $<
config.mk :
$(error @请提供config.mk文件)
# ;所连接的命令将在一个shell进程中执行。
# set -e 指定发生错误后立即退出执行
$(foreach dir,$(BUILD_DIR),$(dir)/%$(DEPS_SUFFIX)) : %.c | $(BUILD_DIR)
@set -e; \
$(CC) -M $(CFLAGS) $< > $@.$$$$; \
sed 's,\($*\)\.o[ :]*,$(dir $@)\1.o $@ : ,g' < $@.$$$$ > $@; \
$(RM) $@.$$$$
$(foreach dir,$(BUILD_DIR),$(dir)/%$(DEPS_SUFFIX)) : %.S | $(BUILD_DIR)
@set -e; \
$(CC) -M $(CFLAGS) $< > $@.$$$$; \
sed 's,\($*\)\.o[ :]*,$(dir $@)\1.o $@ : ,g' < $@.$$$$ > $@; \
$(RM) $@.$$$$
$(BUILD_DIR) :
@$(MKDIR) -p $@
clean :
$(RM) $(BUILD_ROOT)
3.2.5 运行的调试界面
3.2 vscode + wsl + ubuntu22.04
windows原生支持了linux子系统wsl2,我在wsl2中安装了一个ubuntu22.04,使用方法基本与vmware中安装的一致(libusb的编译和安装,tasks.json,launch.json ,Makefile均一致 本章仅介绍不同之处),配合vscode中的wsl插件,个人认为比vmware更加方便。
3.2.1 wsl ubuntu22.04的安装和启动
安装方法网上有很多, 可以参考这篇文章 https://zhuanlan.zhihu.com/p/466001838
-
点击桌面图标启动
-
在shell中直接输入wsl启动
3.2.2 vscode中安装wsl插件和使用
- 安装 wsl插件
- wsl插件的使用
wsl插件使用方法很简单,在wsl ubuntu的工作目录中直接输入 code . 命令,即可打开当前目录。
3.3 vscode + MinGW-w64(MSYS2)
MinGW 的全称是:Minimalist GNU on Windows 。是将经典的开源 C语言 编译器 GCC 移植到了 Windows 平台下,因此可以将源代码编译为可在 Windows 中运行的可执行程序。而且还可以使用一些 Windows 不具备的,Linux平台下的开发工具。一句话来概括:MinGW 就是 GCC 的 Windows 版本 。
- MSYS2包含了MinGW-w64,安装MSYS2即可使用MinGW-w64,可以在https://www.msys2.org/下载安装。
- 使用MSYS2 编译libusb也需要先安装必要的软件包,MSYS2原生支持 pacman 包管理工具(Arch Linux就使用这种包管理工具),使用方法与apt大同小异,可参考https://zhuanlan.zhihu.com/p/350156367,执行如下命令安装必要的软件包:
pacman -S libtool autoconf base-devel gdb
注 : base-devel 类似于ubuntun中的build-essential
- 目前vscode的环境还没有搞定,可以正常编译,但调试时会报错( launch.json文件还存在问题,我在最后会把task.json和launch.json贴出来,makefile都是一样的,希望懂的人指出问题,不胜感激),下图是使用命令行编译运行和调试的过程(与在ubuntu中类似):
- tasks.json文件
{
"tasks": [
{
"label": "make_build",
"type": "shell",
"command": "make",
"options": {
"shell": {
"executable": "C:\\msys64\\ucrt64.exe",
"args": []
}
},
"isBackground": false,
"problemMatcher": [],
"presentation": {
"group": "my-group"
}
}
],
"version": "2.0.0"
}
- launch.json文件
{
// 使用 IntelliSense 了解相关属性。
// 悬停以查看现有属性的描述。
// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "(gdb) 启动",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}\\build\\os",
"args": [],
"stopAtEntry": true,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"miDebuggerPath": "C:\\msys64\\usr\\bin\\gdb.exe", //gdb调试器的路径
"logging":{"engineLogging":true},
"preLaunchTask": "make_build",
"setupCommands": [
{
"description": "为 gdb 启用整齐打印",
"text": "-enable-pretty-printing",
"ignoreFailures": true
},
// {
// "description": "将反汇编风格设置为 Intel",
// "text": "-gdb-set disassembly-flavor intel",
// "ignoreFailures": true
// }
]
}
]
}