您正在查看: 开发 分类下的文章

Windows Developer PowerShell 编译 Qt Quick Designer components 时遇到的奇怪报错与解决方式

需编译的项目

https://github.com/qt-labs/qtquickdesigner-components

编译环境

Windows 11 23H2
Developer PowerShell for VS 2022
Qt 6.8.0 Community

编译命令

PS D:\Projects\qtquickdesigner-components-qds-dev-4.6\qtquickdesigner-components_build> cmake -G"Ninja" -S ../ -DCMAKE_PREFIX_PATH=D:\\Qt\\6.8.0\\msvc2022_64 -DCMAKE_MAKE_PROGRAM:STRING=D:\\Qt\\Tools\\Ninja\\ninja.exe

错误提示

CMake Error at CMakeLists.txt:55 (find_package):
  Could not find a configuration file for package "Qt6" that is compatible
  with requested version "".

  The following configuration files were considered but not accepted:

    D:/Qt/6.8.0/msvc2022_64/lib/cmake/Qt6/Qt6Config.cmake, version: 6.8.0 (64bit)



-- Configuring incomplete, errors occurred!

这个报错非常有迷惑性,初看会以为是构建时找不到对应的 CMake 依赖版本,虽然最后确实是和这点有关。

解决方案

换成默认 x64 编译器的x64 Native Tools Command Prompt for VS 2022

原因

Developer PowerShell for VS 2022环境默认是 x86 的,CMake 无法接受 x64 的 Qt 库作为可用版本。

如果你的 Qt 程序修改后编译出现了无法理喻的奇怪错误,也可以考虑删除原有的构建文件夹,从头构建,注意不是之前也遇到了这种问题,最后发现可能是旧的编译产物和新的冲突了。

使用 USB IP 将 Windows 下的 USB 设备转发至远端 Linux 设备

前言

项目需要在 Linux 私有云虚拟机上开发,但因为是嵌入式项目,涉及到烧录固件之类的操作,之前都是在 Linux 系统上编译好固件,之后用 WinSCP 下载到作为终端的 Windows 笔记本上,把开发板或者模组接在在笔记本上用 J-Flash 烧录,比较麻烦。如果是在本机开发,可以直接用 VSCode 开发环境一键烧录,调试也会方便点。开发板与模组都通过 J-Link 接 USB 与电脑通讯,于是就在想能不能将其转发到 Linux 开发机。之前摸索了一段时间,研究出了下面这个可行的方案。
首先,从原理上讲,这个方案用的就是USB/IP。关于 USB/IP 技术就不做过多介绍了,一言以盖之就是将 USB 协议数据通过 IP 网络传输,感兴趣的话可以看下项目主页

Windows 笔记本端

我在 Windows 上找到了两个可用的USBIP实现,usbip-winusbipd-win。前者有客户端与服务端,但已经不再维护,且需要打开 Windows 的测试模式用于安装相关驱动,有一定风险,不过很多能在网上找到的老文章还在推荐它。我尝试了其服务端实现,但未能成功。后者仅有服务端,但是是微软官方文档推荐的将 Windows 上的 USB 设备转发至 WSL 的实现,且在持续更新,不过只支持 Windows 10 及以上系统版本。目前我们的需求只需要 Windows 笔记本端作为服务端,也就是向外提供 USB 设备的,最后我也选择了usbipd-win。
我的笔记本上的操作系统为 Windows 11 23H2。
首先前往项目官方仓库Release页面下载最新版本的 msi 安装包,并安装到 Windows 电脑上,有可能需要重启。
安装完成后,启动一个管理员权限的终端(CMD 或者 Powershell 都行),确定服务已启动:
sc.exe query usbipd
如果安装正常的话,STATE 应该是 RUNNING。
接下来将想转发的设备插入 Windows 设备的USB接口,有几个就接几个,用usbipd list命令列出所有设备。下面是我在电脑上接入JLink-OB与USB转串口设备后该命令的输出。

PS C:\Users\tian051011> usbipd list
Connected:
BUSID  VID:PID    DEVICE                                                        STATE
2-1    10c4:ea60  Silicon Labs CP210x USB to UART Bridge (COM7)                 Not shared
2-2    1366:0105  JLink CDC UART Port (COM8), J-Link driver                     Not shared
2-3    1532:009a  USB 输入设备, Razer Pro Click Mini                                Not shared
2-6    30c9:0057  Integrated Camera, Integrated IR Camera, APP Mode             Not shared
2-10   8087:0026  英特尔(R) 无线 Bluetooth(R)                                        Not shared

接下来使用usbipd bind命令设置你想要转发的设备,你需要用到上面这个列表里的 BUSID:

PS C:\Users\tian051011> usbipd bind --busid 2-1
PS C:\Users\tian051011> usbipd bind --busid 2-2

如果转发被正常设置了,命令执行之后你应该不会看到任何输出。这时候再次执行usbipd list命令,可以看到设备的状态已经变成了 Shared:

PS C:\Users\tian051011> usbipd list
Connected:
BUSID  VID:PID    DEVICE                                                        STATE
2-1    10c4:ea60  Silicon Labs CP210x USB to UART Bridge (COM7)                 Shared
2-2    1366:0105  JLink CDC UART Port (COM8), J-Link driver                     Shared
2-3    1532:009a  USB 输入设备, Razer Pro Click Mini                            Not shared
2-6    30c9:0057  Integrated Camera, Integrated IR Camera, APP Mode             Not shared
2-10   8087:0026  英特尔(R) 无线 Bluetooth(R)                                   Not shared

对特定设备的转发只需要设置一次,之后只要此设备连入,即可被转发。注意虽然我们设置转发时使用的参数是 busid,但并不是之后接入这个bus的设备就会被转发,程序不过是采用这个数据读取 VID 与 PID,被设置转发的只能是由这两个参数标记的某个设备。Windows 端的操作结束了。

Linux 服务器端

首先,你需要确保 Linux 服务器可以通过 IP 网络连接到 Windows 端,可以是通过局域网,也可以是 SSH 端口转发或者公网 IP(这种情况会有安全风险)。请将下文的192.168.123.123替换成你的 Linux 服务器访问 Windows 主机的IP。
Linux端的操作系统为Ubuntu 22.04.4 LTS (GNU/Linux 5.15.0-113-generic x86_64)
首先需要安装usbip相关的软件包sudo apt install linux-image-extra-virtual linux-tools-generic hwdata
然后加载usbip相关的内核模块sudo modprobe vhci-hcd
最后就是将Windows端的设备转发到Linux服务器了sudo usbip attach --remote=192.168.10.16 --busid=2-1,有几个就转发几个。
如果全程没有出错,此时用lsusb命令就能看到被转发过来的设备了。

ubuntu@tian-server:~$ lsusb
Bus 003 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 002 Device 012: ID 1366:0105 SEGGER J-Link
Bus 002 Device 011: ID 10c4:ea60 Silicon Labs CP210x UART Bridge
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub

之后就可以在你需要使用的应用中使用这个 USB 设备了,对于我来说,就是用 VSCode 远程开发环境操作被转发过来的设备。

改变rustup默认安装目录

默认情况下,rustup安装的Rust在用户目录下,对于Windows用户就是C盘。假如你的C盘比较小,这样长期使用的结果就是C盘被挤爆。还好rustup可以通过修改环境变量来改变安装目录。这两个环境变量分别是RUSTUP_HOMECARGO_HOME

  • RUSTUP_HOME:存储工具链和配置文件
  • CARGO_HOME:存储cargo的缓存

你需要在rustup运行之前修改好这两个环境变量。对于Linux用户也是这两个环境变量。

Windows

此电脑->属性->高级系统设置->环境变量,新建两个系统变量,变量名分别为RUSTUP_HOMECARGO_HOME,变量值指向你希望的安装目录,比如说D:\rust-toolchainD:\cargo-cache,之后运行rustup就可以安装了。

Linux

打开终端,设定环境变量

export RUSTUP_HOME=[你希望的安装位置]
export CARGO_HOME=[你希望的安装位置]

之后在这个终端窗口运行rustup就好了。