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插件安装与使用

VMwareubuntu22.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
                // }
            ]
        }
    ]
}
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐