资讯动态

Windows下用MSYS2编译libhackrf搭建HackRF开发环境

发布时间:2026/9/7 6:31:28 来源:尧图企业网站定制
简介面向x64 Windows平台的libhackrf预编译库专供在Visual Studio 2022中开发HackRF One软件定义无线电SDR应用的开发者使用。基于VS2022编译完成可直接添加头文件和库到工程调用API控制HackRF One的频率、收发与数据读写免去自行编译驱动和依赖的繁琐步骤适合射频通信实验、协议分析、信号发生与接收等应用场景。压缩包体积仅126KB共5个文件包含3个动态链接库、1个头文件和1个静态导入库dll负责运行时底层依赖如USB通信与线程支持头文件声明全部API接口lib用于编译链接开发者在VS2022中配置好包含目录与链接项即可无缝集成。已有690人学习下载压缩包按include、bin等目录组织结构清晰拿到后可直接投入SDR项目开发也便于后续基于开源libhackrf生态做自定义扩展与调试。 做无线电和SDR开发这些年HackRF One是我桌面上用得最勤的设备之一调天线、抓环境信号、验证协议基本都靠它。平时主力是Linux装个hackrf-tools、libhackrf事情很快就能跑起来。但前阵子因为需要在一台x64 Windows主机上做信号采集验证我不得不把整套HackRF开发环境从Linux迁到Windows这才发现libhackrf在Windows x64下的构建资料少得可怜官方Wiki写得简略网上不少帖子也已经过时。libhackrf是负责和HackRF One硬件通信的C库应用通过它提供的API就能让HackRF完成频率设置、增益配置、采样率调整以及IQ数据收发。GNURadio的OsmoSDR插件、SDR#的HackRF插件底层调用的都是同一套东西。我习惯把它理解为HackRF硬件是“身体”libhackrf是“神经中枢”你的程序最终都要通过它来指挥硬件。这里不打算讲太多理论重点是我在x64 Windows环境下编译libhackrf的完整实操过程工具链选型、驱动替换、CMake构建、第一个Demo程序以及几个容易踩的坑。要在Windows下做SDR二次开发的同学可以直接照着抄。1. 想清楚技术方向Windows x64下搭libhackrf环境的三条路线1.1 libhackrf在整套SDR技术栈里的位置一个常见误区是把HackRF One插到电脑上Windows能识别出设备就觉得一切就绪。其实HackRF本身是个USB外设libhackrf的底层直接依赖libusb它做的事情可以拆成两层把上层API调用转换成USB控制传输用来配置频率、增益、滤波器等工作状态再通过USB的Bulk传输管道把射频前端采集到的IQ样本送到你的应用回调函数里。没有libhackrf这层你的程序只能对着一个“能识别但用不了的USB设备”发呆。所以你在Windows下做的事情本质上就是把libusb和libhackrf这两层跑通。这两层通了之后上层无论是用GNURadio、SDR#还是自己写的小工具硬件访问的问题都算彻底解决。这也是为什么我开始动手之前先花了不少时间确认工具链方案——方向错了后面全是白干。1.2 三条主路线对比为什么我推荐MSYS2加MinGW-w64在x64 Windows下构建libhackrf并不是只有一条路。我实际接触过三个方案取舍很清晰。路线AMSYS2 MinGW-w64。这是我最常用的方案。MSYS2的MinGW64 shell里目录风格和Linux很像用pacman装依赖很顺手编译出来的DLL不依赖MSVC运行时体积小、部署方便。整个hackrf的host目录一次就能编译出libhackrf和hackrf-tools。路线BVisual Studio vcpkg。vcpkg有现成的hackrf端口vcpkg install hackrf:x64-windows就能装好之后和MSVC工程无缝集成。缺点是vcpkg拉取和编译比较耗时如果只做动态库使用这个方案相对笨重。路线C直接装预编译的PothosSDR。PothosSDR是一体化SDR软件套件自带hackrf-tools。装完确实能立刻用命令行工具验证硬件但它给不了独立开发用的库文件和头文件做不了二次开发。方案优点缺点适合场景MSYS2MinGW-w64依赖好装、编译快、库可独立部署需要适应MSYS2的Shell环境二次开发、动态库使用Visual Studiovcpkg与MSVC工程集成度高拉取慢、编译重大型Windows桌面应用PothosSDR装完即用、零编译无法独立引用库文件纯工具用途、快速验证我最后选了路线A后面所有步骤都基于这个方案展开。2. 搭建MSYS2编译环境并安装依赖2.1 MSYS2安装和MINGW64环境切换先从MSYS2官网下载安装包。安装完成后桌面上会出现“MSYS2 MINGW64”和“MSYS2 MSYS”两个终端注意这里必须用MINGW64因为我们要编译的是x64的库。打开后先更新系统包pacman -Syu有时更新期间会提示“terminate MSYS2 without running any Bash code”这是正常现象因为某些核心文件需要先替换。关掉终端重新打开再执行一次pacman -Syu直到输出没有待更新内容为止。这个环节我踩过一次坑直接在默认的MSYS终端里编译结果gcc编译出来的程序是32位的后面越走越偏。所以打开终端后先看窗口标题栏是不是有MINGW64字样。如果你用Windows Terminal也记得配置MSYS2的MINGW64 profile不要开错环境。2.2 安装gcc、cmake、libusb等关键依赖工具链和依赖一次性装齐pacman -S --needed --noconfirm \ git make \ mingw-w64-x86_64-gcc \ mingw-w64-x86_64-cmake \ mingw-w64-x86_64-libusb \ mingw-w64-x86_64-pkgconf这里重点说下mingw-w64-x86_64-libusb。MSYS2里还有一个叫libusb的包但它不是给MinGW64用的如果只装了后者编译libhackrf时依然会报找不到libusb.h。我第一次就装错包了排查了好一阵子。这个细节很多人不会提醒你可以先记下来。装完可以用gcc --version、cmake --version快速验证确保指向/mingw64路径下的命令。在普通cmd或Windows Terminal的默认profile里调用cmake很容易出现CMake去查找Visual Studio生成器的问题所以后面的操作我都建议固定在MINGW64终端里完成。3. 驱动这关不能跳过HackRF在Windows下需要换WinUSB驱动3.1 为什么Windows默认驱动不行把HackRF插到Windows电脑上系统默认会装一个通用USB驱动设备管理器能看到设备表面看已经正常识别。但libusb在Windows下要求设备绑定到WinUSB或libusb-win32驱动否则拿不到传输接口的访问权。所以在驱动没换的情况下即使库编译成功hackrf_init能过hackrf_open也会失败。HackRF One在正常固件模式下的VID/PID是1d50:6089Zadig里会显示为“OpenMoko, Inc. HackRF One”。如果板子上刷的是其他固件或者用的是兼容板VID/PID会略有不同所以Zadig里不要只死记数字要看设备名称。3.2 Zadig替换驱动的完整步骤Zadig是Windows下常用的通用USB驱动安装工具操作流程如下把HackRF插到电脑上建议插主机背面原生USB口不要用前置面板或者廉价HUB。打开Zadig在菜单栏选择Options - List All Devices让隐藏设备也显示出来。在下拉列表中找到HackRF One确认右侧USB ID显示1D50:6089。目标驱动Target Driver选择WinUSB然后点击Replace Driver。安装过程中如果弹出驱动签名提示选择信任安装。完成后重新插拔HackRF。替换成功后打开设备管理器能在“通用串行总线设备”分类下看到“WinUSB device”。到这一步libusb才能正常访问设备。3.3 驱动替换后的验证手段驱动装没装好最快的验证方法是跑一下hackrf-tools里的hackrf_info。如果输出里能看到“Found HackRF”和“Board ID Number”说明驱动和访问链路都是通的。如果还是报错多尝试换一个USB口或者在Zadig里再覆盖安装一次驱动。有个我印象很深的细节Zadig在设备列表里可能会同时出现“Interface 0”和“Composite Device”要选“Interface 0”去替换。选错了看起来装好了命令跑起来照样不认设备。因为libusb访问的是接口层的驱动而不是整个复合设备的驱动。4. 从源码构建libhackrf全流程4.1 拉取HackRF主仓库源码HackRF的代码托管在GitHub上仓库里的host目录就是主机端工程的根目录libhackrf和hackrf-tools都在这里面。拉取命令git clone https://github.com/greatscottgadgets/hackrf.git cd hackrf/host网速不好的话可以加--depth1只拉最新一次提交。我们用的是稳定release代码不需要历史记录。4.2 CMake生成MinGW构建系统并编译在hackrf/host下新建build目录避免编译产物和源码混在一起mkdir build cd build cmake .. -G MinGW Makefiles -DCMAKE_BUILD_TYPERelease cmake --build . --config Release这里最关键的是-G MinGW Makefiles。不指定的话CMake在Windows上默认会去找Visual Studio生成器然后要么报“Unable to find a matching Visual Studio”要么生成一堆vcxproj文件跟MinGW完全不搭。编译完成后在build/src目录下会得到libhackrf.dll和libhackrf.dll.a在build/hackrf-tools/src下会得到一系列exe工具。注意动态库的导入库是libhackrf.dll.a不是libhackrf.a链接时用错会报找不到库。4.3 安装库文件到系统目录为了方便编译自己的程序建议执行一次安装make install默认安装路径是/mingw64头文件会放到/mingw64/include/libhackrf库文件会放到/mingw64/libDLL放到/mingw64/bin。这样后面写代码时#include libhackrf/hackrf.h和-lhackrf都能直接生效不用手动指定一堆路径。如果不想安装也可以直接引用build目录里的头文件和库但每次编译都要带-I和-L参数比较烦。个人建议还是安装一劳永逸。5. 编写第一个libhackrf演示程序5.1 关键API速查用libhackrf开发最基本的一套API需要先熟悉。下面的Demo会用到其中大部分API作用hackrf_init()初始化库所有程序必调hackrf_exit()释放库资源hackrf_device_list()枚举当前连接的HackRF设备hackrf_open_by_serial()按序列号打开设备hackrf_board_id_read()读取板卡型号IDhackrf_version_string_read()读取固件版本hackrf_board_partid_serialno_read()读取板卡Part ID和序列号hackrf_close()关闭已打开设备这里想强调一点多设备场景下务必用list-serial_numbers[0]去打开设备而不要直接hackrf_open()。后者固定打开第一个被系统枚举到的设备插拔顺序一变程序访问的硬件可能就错了。5.2 完整可编译的设备信息读取程序下面这个程序做了四件事初始化库、枚举设备、打开设备、打印硬件信息。麻雀虽小五脏俱全能跑通说明整条链路已经打通。#include stdio.h #include string.h #include stdint.h #include hackrf.h static void print_device_info(hackrf_device *device) { uint8_t board_id 0; char version[128] {0}; read_partid_serialno_t board_ids; int ret; ret hackrf_board_id_read(device, board_id); if (ret HACKRF_SUCCESS) { printf(Board ID: %s (%u)\n, hackrf_board_id_name(board_id), board_id); } else { printf(board_id read failed: %s\n, hackrf_error_name(ret)); } ret hackrf_version_string_read(device, version, sizeof(version)); if (ret HACKRF_SUCCESS) { printf(Firmware Version: %s\n, version); } else { printf(version read failed: %s\n, hackrf_error_name(ret)); } memset(board_ids, 0, sizeof(board_ids)); ret hackrf_board_partid_serialno_read(device, board_ids); if (ret HACKRF_SUCCESS) { printf(Part ID: 0x%08x%08x\n, (unsigned int)board_ids.part_id[0], (unsigned int)board_ids.part_id[1]); printf(Serial Number: 0x%08x%08x\n, (unsigned int)board_ids.serial_no[0], (unsigned int)board_ids.serial_no[1]); } else { printf(serialno read failed: %s\n, hackrf_error_name(ret)); } } int main(void) { hackrf_device *device NULL; hackrf_device_list_t *list NULL; int ret; ret hackrf_init(); if (ret ! HACKRF_SUCCESS) { fprintf(stderr, hackrf_init failed: %s\n, hackrf_error_name(ret)); return 1; } list hackrf_device_list(); if (list NULL || list-devicecount 0) { fprintf(stderr, No HackRF device found.\n); hackrf_exit(); return 1; } printf(Found %d HackRF device(s).\n, list-devicecount); if (list-serial_numbers[0] ! NULL) { ret hackrf_open_by_serial(list-serial_numbers[0], device); } else { ret hackrf_open(device); } if (ret ! HACKRF_SUCCESS) { fprintf(stderr, hackrf_open failed: %s\n, hackrf_error_name(ret)); hackrf_exit(); return 1; } print_device_info(device); hackrf_close(device); hackrf_device_list_free(list); hackrf_exit(); return 0; }代码不复杂但把错误处理都写上了。实际项目里很多人写测试程序时不检查返回值一旦驱动有问题程序可能直接崩溃或者输出莫名其妙的结果。把返回值检查加上问题定位会快很多。5.3 编译、链接和运行要注意的几个细节执行编译gcc hackrf_demo.c -o hackrf_demo.exe -lhackrf前提是libhackrf已经make install到/mingw64里。如果不想安装就需要手动指定路径gcc hackrf_demo.c -o hackrf_demo.exe \ -I/mingw64/include -L/path/to/hackrf/host/build/src -lhackrf这里有一个MinGW下很容易踩的编译坑-lhackrf一定要放在源文件后面。GCC的链接顺序是从左到右解析符号如果你写成gcc -lhackrf hackrf_demo.c -o hackrf_demo.exe链接器在路过-lhackrf时还不知道有hackrf_init这些未定义符号结果就会报一堆undefined reference to hackrf_init其实只是顺序问题。运行前把libhackrf.dll和libusb-1.0.dll放到exe同目录下或者确认它们在PATH里。在MSYS2终端里直接跑一般没问题如果从cmd窗口运行经常报“找不到libhackrf.dll”。如果还提示缺少libgcc_s_seh-1.dll、libwinpthread-1.dll这些文件也在/mingw64/bin下一起复制过去即可。程序正常输出效果类似Found 1 HackRF device(s). Board ID: HackRF One (2) Firmware Version: 2023.01.1 Part ID: 0x1234567812345678 Serial Number: 0xabcdefabcdef1234到这里HackRF设备信息就读出来了开发环境真正可用。6. 常见问题与排查经验6.1 编译期遇到的两个典型报错找不到libusb.h。确认MSYS2里装的是mingw-w64-x86_64-libusb不是libusb。重新执行pacman -S --needed mingw-w64-x86_64-libusb基本能解决。CMake生成器不对。报错信息里出现“Visual Studio”或者“vcxproj”字样基本就是没有加-G MinGW Makefiles。在MINGW64终端里CMake默认生成器应该已经被MSYS2调整过但如果你在cmd或PowerShell里调用cmake它还是会去找MSVC。最省事的办法是全程待在MINGW64终端里操作。6.2 运行期遇到的两个头疼问题能枚举到设备但打不开。优先怀疑驱动没换干净。打开Zadig重新给HackRF的Interface 0换一遍WinUSB然后重新插拔。我遇到过Zadig显示已经装了WinUSB但设备管理器里同时存在多个驱动的情况最终是把旧驱动卸载后重新安装才解决。DLL缺失。在cmd下运行exe提示缺少libhackrf.dll或libusb-1.0.dll。这是典型的PATH问题最简单的处理是把DLL复制到exe同目录。MinGW编译的程序有时还依赖libgcc_s_seh-1.dll、libwinpthread-1.dll同样从/mingw64/bin复制过去就行。6.3 采集数据时的稳定性经验如果你的程序已经开始用hackrf_start_rx做IQ采样我再给几个建议。首先采样率不要一上来就拉到最大值。HackRF标称采样率支持到20Msps但在Windows的USB栈下超过10Msps之后很容易出现Overrun回调函数处理不过来。我通常先跑2Msps或4Msps验证流程确认数据链路稳定后再逐步往上升。其次回调函数里不要做耗时操作。libhackrf的接收回调是USB线程直接调用的正确做法是把数据丢进缓冲队列让主线程去做FFT、写盘、显示这些事。直接在回调里做重活一定会掉数据。第三长时间运行时USB供电问题会逐渐暴露。如果程序跑着跑着设备消失优先换一个供电稳定的USB口别用前置面板那种电流不够的接口。这些经验不一定写在官方文档里但都是实打实会遇到的情况。7. 最后分享几个踩坑之后的沉淀用MSYS2在x64 Windows下把libhackrf跑通之后最直观的感受是这套环境本身并不复杂复杂的是新手容易在驱动和工具链上反复绕路。我自己第一次折腾时浪费了半天在错误安装的libusb包上又花了半天跟Zadig的接口选择较劲。如果让我给一个最快的复现路径那就是MINGW64终端里一次性装齐依赖Zadig给Interface 0装WinUSBCMake用MinGW Makefiles生成器编译写程序时记得检查返回值。按这个顺序顺利的话一小时就能看到自己的程序把HackRF的信息打出来。后面再扩展的话可以在这个基础上做基于异步回调的IQ数据采集比如做一个简易频谱仪或者把数据通过UDP送到另一台机器做处理。libhackrf本身提供的API足够简洁真正需要花心思的是数据链路和信号处理部分。希望这篇记录能让你在Windows x64下少走点弯路。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价