使用 MSYS2 Qt6 发布绿色版的SDR软件无线电应用

文章目录

    • 概要
    • 整体架构流程
    • 技术名词解释
    • 技术细节
      • 在启动器中为子进程设置路径和环境。
      • 如何迅速找齐所有的DLL
    • 小结
    • 附件

概要

新接触软件定义无线电(SDR)的朋友一般都会一股脑的安装一些现有的SDR平台。无论是GNURadio还是SDR++、SDRSharp、SDRAngel,几乎都是要一顿操作猛如虎,安装很多依赖项。如果恰好在一台崭新的windows计算机上安装了多个平台,还可能因为环境变量的污染,导致一些问题。比如libusb版本不同,使得一些SDR设备工作不正常。

当自己跃跃欲试,想像我一样构造自己的SDR上位机平台时,必然也会遇到依赖性的问题。由于特别喜欢路径无关的绿色软件,自己总想着找个办法,使得SDR程序拷贝到一个崭新的计算机上直接可以点开运行,并驱动我的山寨USRP B205mini。经过一段时间的研究,我发现使用MSYS2 Qt环境可以实现这种绿色版本的发布包。

整体架构流程

整体思路是用一个启动器作为运行时路径、环境变量的维护者,而非污染全局PATH和环境变量。

启动
启动器
主程序
环境
PATH

主要步骤:

  1. 正确编译软件。
  2. 拷贝可执行文件到发布文件夹。
  3. 使用 windeployqt6 拷贝基础的Qt6依赖(插件、库)。
  4. 使用拷贝命令拷贝所有库到主发布文件夹。
  5. 在启动程序中,设置进程内的环境变量,指明Qt库、UHD驱动库的位置,这样启动的子进程都将共享当前的环境。
  6. 把编译环境下的Qt文件夹、UHD文件夹临时改名,以确保不会因为全局PATH污染,漏掉DLL没有拷贝。
  7. 启动程序并全功能运行,包括可能的数据库、网络、Charts功能。这样保证大多数依赖的DLL被占用。
  8. 在程序运行时,把冗余的DLL全选,删除。删不掉的就是需要的。
  9. 找一台空白虚机,拷贝过去测试。如果缺少文件,用ldd或者dumpbin或者Dependencies 查看依赖。
  10. 打包发布

技术名词解释

  • windeployqt6 :是Qt的一个工具,用于自动化部署Qt应用程序所需的依赖项。当您使用Qt创建Windows应用程序时,您通常需要将一些Qt库和其他依赖项打包到您的应用程序中,以确保在其他计算机上运行时具有所需的依赖项。windeployqt6可以自动检测并将所有必要的依赖项复制到您的应用程序目录中,以便您可以将其部署到其他计算机上。但是它在MSYS2下不会递归复制依赖,复制的Qt库仍旧依赖额外的动态库。因此,需要使用其他方法补充过去。

  • UHD 库 :UHD(USRP Hardware Driver)是Ettus Research公司开发的一种驱动软件,用于与USRP(Universal Software Radio Peripheral)软件定义无线电硬件交互。UHD提供了一个跨平台的API,支持多种操作系统和编程语言,可以轻松地访问和控制USRP硬件的功能。UHD库提供了一系列函数和类,用于控制USRP设备的各种参数和功能,包括频率、增益、带宽、采样率、同步、校准等。同时,UHD也支持通过网络连接多个USRP设备,以实现更高级别的应用。

技术细节

在启动器中为子进程设置路径和环境。

静态编译启动器可以使得启动器本身不需要Qt库的支持。主要用到的是 qget/putenv 函数。

int main(int argc, char *argv[])
{QApplication app(argc, argv);//Change CurrentDirQDir dir("/");dir.setCurrent(app.applicationDirPath());//set Plugin PATHQSettings settings(QCoreApplication::applicationFilePath()+".ini",QSettings::IniFormat);QString plgPath = settings.value("settings/QT_PLUGIN_PATH",QCoreApplication::applicationDirPath()).toString();QString uhdPath = settings.value("settings/UHD_PKG_PATH",QCoreApplication::applicationDirPath()+"/../uhd").toString();QDir dir_plg (plgPath), dir_uhd(uhdPath);plgPath = dir_plg.absolutePath();uhdPath = dir_uhd.absolutePath();QString strUHDPath = qgetenv("UHD_PKG_PATH");if (!strUHDPath.length()){strUHDPath = uhdPath;qputenv("UHD_PKG_PATH",strUHDPath.toUtf8());}QString strPluginPath = qgetenv("QT_PLUGIN_PATH");if (strPluginPath.length())strPluginPath += ";";strPluginPath += plgPath;qputenv("QT_PLUGIN_PATH",strPluginPath.toUtf8());QString strExePath = qgetenv("PATH");if (strExePath.length())strExePath += ";";strExePath += strUHDPath+"\\bin;";strExePath += QCoreApplication::applicationDirPath();qputenv("PATH",strExePath.toUtf8());//...启动真正的程序并隐藏自己。
}

如何迅速找齐所有的DLL

虽然有各种依赖项工具,但对上百个dll依赖而言,一个个找太难了。这里就要用到一种暴力的方法,且只对windows有效(Linux下程序运行时不会锁死可执行文件和库)。

拷贝全部可能的依赖到可执行文件夹,而后运行程序,并全选DLL、删除。这样,会剩下一些删不掉的。

注意事项:

  1. 一些延迟加载的插件不一定被加载。比如QtSql可能只有在真实连接到 mysql时,libmariadb.dll以及libssl等才被占用。所以,万一没有找全,再用Dependencies 查看相应qsql插件的依赖,针对性就很强了。
  2. 解决冲突的依赖。如果两个程序依赖同名的dll,但dll的版本要求不同,则需要把这两个程序和独到的依赖拎出来,放到独立的文件夹下。windows下,会优先匹配本文件夹的库。这是与Linux的重大不同。

小结

使用该方法,我们整合了 taskBus SDR发布包,除了 PCAP驱动需要安装外,其余的设施全部都是绿色版直接运行。
SDR

相关代码和文件夹参考
https://gitcode.net/coloreaglestdio/taskbus
https://gitcode.com/colorEagleStdio/taskbus/overview

以及我的SDR专栏。

附件


E:\Publish\taskbus.uhd4.6_20240509
|   
+---bin
|   |   default_mods.text
|   |   lame.exe
|   |   libb2-1.dll
|   |   libbrotlicommon.dll
|   |   libbrotlidec.dll
|   |   libbz2-1.dll
|   |   libcrypto-3-x64.dll
|   |   libcurl-4.dll
|   |   libdeflate.dll
|   |   libdouble-conversion.dll
|   |   libfftw3-3.dll
|   |   libfreetype-6.dll
|   |   libgcc_s_seh-1.dll
|   |   libglib-2.0-0.dll
|   |   libgraphite2.dll
|   |   libharfbuzz-0.dll
|   |   libiconv-2.dll
|   |   libicudt74.dll
|   |   libicuin74.dll
|   |   libicuuc74.dll
|   |   libidn2-0.dll
|   |   libintl-8.dll
|   |   libjasper.dll
|   |   libjbig-0.dll
|   |   libjpeg-8.dll
|   |   liblcms2-2.dll
|   |   libLerc.dll
|   |   liblzma-5.dll
|   |   libmariadb.dll
|   |   libmd4c.dll
|   |   libmng-2.dll
|   |   libnghttp2-14.dll
|   |   libpcre2-16-0.dll
|   |   libpcre2-8-0.dll
|   |   libpng16-16.dll
|   |   libpq.dll
|   |   libpsl-5.dll
|   |   libsharpyuv-0.dll
|   |   libssh2-1.dll
|   |   libssl-3-x64.dll
|   |   libstdc++-6.dll
|   |   libtiff-6.dll
|   |   libtommath-1.dll
|   |   libunistring-5.dll
|   |   libwebp-7.dll
|   |   libwebpdemux-2.dll
|   |   libwebpmux-3.dll
|   |   libwinpthread-1.dll
|   |   libzstd.dll
|   |   Qt6Charts.dll
|   |   Qt6Core.dll
|   |   Qt6Gui.dll
|   |   Qt6Multimedia.dll
|   |   Qt6Network.dll
|   |   Qt6OpenGL.dll
|   |   Qt6OpenGLWidgets.dll
|   |   Qt6Pdf.dll
|   |   Qt6Sql.dll
|   |   Qt6Svg.dll
|   |   Qt6Widgets.dll
|   |   taskBusConsole.exe
|   |   taskBusConsole.ini
|   |   taskBusConsole.text
|   |   taskBusPlatform.exe (启动程序)
|   |   taskBusPlatform.exe.ini
|   |   zlib1.dll
|   |   
|   +---generic
|   |       qtuiotouchplugin.dll
|   |       
|   +---iconengines
|   |       qsvgicon.dll
|   |       
|   +---imageformats
|   |       qgif.dll
|   |       qicns.dll
|   |       qico.dll
|   |       qjp2.dll
|   |       qjpeg.dll
|   |       qmng.dll
|   |       qpdf.dll
|   |       qsvg.dll
|   |       qtga.dll
|   |       qtiff.dll
|   |       qwbmp.dll
|   |       qwebp.dll
|   |       
|   +---networkinformation
|   |       qglib.dll
|   |       qnetworklistmanager.dll
|   |       
|   +---platforms
|   |       qwindows.dll
|   |       
|   +---styles
|   |       qmodernwindowsstyle.dll
|   |       
|   |           
|   +---tls
|   |       qcertonlybackend.dll
|   |       qopensslbackend.dll
|   |       qschannelbackend.dll
|   |       
|   \---translations
|           qt_zh_CN.qm
|           qt_zh_TW.qm
|           
+---course
|   |   8psk_network_A.tbj
|   |   8psk_network_B.tbj
|   |   
|   +---a0common
|   |       a0simplechannel.exe
|   |       
|   +---a1frame
|   |       a1frame_askdem.exe
|   |       a1frame_askmod.exe
|   |       a1frame_decap.exe
|   |       a1frame_encap.exe
|   |       
|   \---a2psk
|           a2psk_decap.exe
|           a2psk_dem.exe
|           a2psk_encap.exe
|           a2psk_mod.exe
|           
+---examples
|   |   adsb_reciever.tbj
|   |   adsb_rtlsdr.tbj
|   |   example_nodejs.tbj
|   |   example_python.tbj
|   |   example_python2.tbj
|   |   mp3_player.tbj
|   |   pluto_fmradio.tbj
|   |   readme.txt
|   |   rtl_sdr_fm_wrapper.tbj
|   |   soundcard.tbj
|   |   soundcard_antiblocking.tbj
|   |   soundcard_client.tbj
|   |   soundcard_server.tbj
|   |   subproject.tbj
|   |   usrp_b210_dualio.tbj
|   |   usrp_fmp3_emit.tbj
|   |   usrp_fm_emitter.tbj
|   |   usrp_fm_reciever.tbj
|   |   usrp_fm_wrapper.tbj
|   |   usrp_sample_replay.tbj
|   |   voice_spec.exe
|   |   voice_spec.exe.ini
|   |   voice_spec.tbj
|   |   voice_spec.text
|   |   
| 
|           
+---modules
|   |   control_pannel.exe
|   |   control_pannel.md
|   |   filter_fir.exe
|   |   mod_fm.exe
|   |   mod_fm_dem.exe
|   |   network_p2p.exe
|   |   resample_pqfraction.exe
|   |   sink_file.exe
|   |   sink_file.md
|   |   sink_plots.exe
|   |   sink_soundcard.exe
|   |   sink_SQL.exe
|   |   source_files.exe
|   |   source_soundcard.exe
|   |   transform_fft.exe
|   |   wrapper_stdio.exe
|   |   
|   +---network_p2p.handbook
|   |       network_p2p.md
|   |       ui.jpg
|   |                   
|   +---plutosdr
|   |       libiconv-2.dll
|   |       libiio.a
|   |       libiio.dll
|   |       libiio.dll.a
|   |       liblzma-5.dll
|   |       libserialport-0.dll
|   |       libusb-1.0.dll
|   |       libxml2-2.dll
|   |       sink_plutosdr.exe
|   |       source_plutosdr.exe
|   |       zlib1.dll
|   |       
|   +---usrp
|   |       uhd_usrp_continous.exe
|   |       uhd_usrp_io.exe
|   |       
|   \---wrapper_scripts
|           wrapper_scripts.exe
|           
+---pcap_hub
|       pcapHub.exe
|       
+---qplanetosm
|   |   libqtvplugin_geomarker.dll1.ini
|   |   libqtvplugin_grid.dll1.ini
|   |   libqtwidget_planetosm_designer.dll.a
|   |   qtviewer_planetosm.exe
|   |   qtviewer_planetosm.exe.ini
|   |   qtvplugin_geomarker.dll
|   |   qtvplugin_grid.dll
|   |   qtwidget_planetosm.dll
|   |   test_container.exe
|   |   test_container.exe.ini
|   |   
|
|                       
+---rtl_sdr
|       libusb-1.0.dll
|       pthreadVC2.dll
|       rtlsdr.dll
|       rtl_adsb.exe
|       rtl_biast.exe
|       rtl_eeprom.exe
|       rtl_fm.exe
|       rtl_ir.exe
|       rtl_power.exe
|       rtl_raw2wav.exe
|       rtl_sdr.exe
|       rtl_tcp.exe
|       rtl_test.exe
|       rtl_udp.exe
|       rtl_wavestat.exe
|       rtl_wavestream.exe
|       vcruntime140.dll
|       
|               
\---uhd|   +---bin|       libusb-1.0.dll|       rfnoc_image_builder|       uhd.dll|       uhd_adc_self_cal.exe|       uhd_cal_rx_iq_balance.exe|       uhd_cal_tx_dc_offset.exe|       uhd_cal_tx_iq_balance.exe|       uhd_config_info.exe|       uhd_find_devices.exe|       uhd_image_loader.exe|       uhd_usrp_probe.exe|       usrpctl|       |                   |               \---share|                       \---uhd|   FastSendDatagramThreshold.reg|   +---cal|       cal_metadata.fbs|       dsa_cal.fbs|       iq_cal.fbs|       pwr_cal.fbs|       +---images|       erllc_uhd.cat|       erllc_uhd_b100.inf|       erllc_uhd_b200.inf|       erllc_uhd_b200mini.inf|			...|       usrp_x440_fpga_X4_400.dts|       usrp_x440_fpga_X4_400.dts.md5|       usrp_x440_fpga_X4_400.rpt|       WdfCoInstaller01009.dll|       winusbcoinstaller2.dll|       \---rfnoc+---blocks|       addsub.yml|       axi_ram_fifo.yml|       ddc.yml|       duc.yml|       fft_1x64.yml|       fir_filter.yml|       fosphor.yml|       keep_one_in_n.yml|       logpwr.yml|       moving_avg.yml|       null_src_sink.yml|       radio.yml|       replay.yml|       siggen.yml|       split_stream.yml|       switchboard.yml|       vector_iir.yml|       window.yml|       \---coree310_bsp.ymle320_bsp.ymlio_signatures.ymln300_bsp.ymln310_bsp.ymln320_bsp.ymlrfnoc_imagebuilder_args.jsonx300_bsp.ymlx310_bsp.ymlx410_bsp.ymlx440_bsp.yml

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/9556.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++map和set(个人笔记)

Cmap和set 1.set1.1set的使用1.1.1 set的模板参数列表1.1.2set的构造1.1.3set的迭代器1.1.4 set的容量1.1.5 set修改操作1.1.6 set的具体使用例子 2.map2.1map的使用2.1.1map的模板参数列表2.1.2map的构造2.1.3map的迭代器2.1.4 map的容量与元素访问2.1.5 map中元素的修改2.1.6…

模电·基本共基放大电路

基本共集放大电路 图1.(a)所示为基本共基放大电路,根据放大电路的组成原则,为使晶体管发射结正向偏置且 U B E > U o n {U\tiny BE}>{U\tiny on} UBE>Uon,在其输入回路加电源 V B B V\tiny BB VBB&#xf…

Photoshop中绘图及图像修饰工具的应用

Photoshop中绘图及图像修饰工具的应用 Photoshop中的颜色设置与取样前景色与背景色颜色取样 Photoshop中的颜色替换工具Photoshop中的渐变工具Photoshop中的描边命令Photoshop中的填充工具采用油漆桶进行填充采用填充命令进行填充 Photoshop中的擦除工具 Photoshop中的颜色设置…

SQL子查询练习

学习链接:https://sqlzoo.net/wiki/Window_LAG ● 【题目1】查询在欧洲(Europe)人均gdp大于英国 (United Kingdom)的国家名。人均国内生产总值(人均GDP)国内生产总值(GDP)/人口(populaiton)。…

智能奶柜:健康生活新风尚

智能奶柜:健康生活新风尚 在快节奏的都市生活中,健康与便利成为了现代人的双重追求。而在这两者交汇之处,智能奶柜应运而生,它不仅是科技与生活的完美融合,更是日常营养补给的智慧之选。 清晨的第一缕温暖 —— 新鲜…

pycharm编译器背景设置

最近,瞎逛的时候发现个好玩的,pycharm竟然可以设置背景了,也不知道是不是我太out了,觉得很有意思,略微记录一下 如下步骤: 第五步:选择自己的图片路径 第六步:设置图片透明度&…

【讲解下迭代加深搜索】

🌈个人主页: 程序员不想敲代码啊 🏆CSDN优质创作者,CSDN实力新星,CSDN博客专家 👍点赞⭐评论⭐收藏 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共…

自动驾驶系统中的数据闭环:挑战与前景

目录 自动驾驶概况 1.1自动驾驶分级 1.2自动驾驶国内发展 ​1.3自动驾驶架构模型 数据闭环的意义 2.1 搜集corner case的数据 2.2 提高模型的泛化能力 2.3 驱动算法迭代 数据闭环落地的痛点及对策 3.1 数据采集和使用的合规性问题 3.2 数据确权问题 3.3 数据采集…

Interpreting Super-Resolution Networks with Local Attribution Maps

CVPR2021 问题引入 主要针对的是深度模型的不可解释性,本文使用attribution analysis来分析输入的哪些像素对SR的结果贡献最大;本文提出了Local Attribution Maps,是一种归因方法,延伸了path integral gradient method&#xff…

CLI举例:通过URL分类控制用户访问的网站

华为CLI举例:通过URL分类控制用户访问的网站 配置基于URL分类的URL过滤功能,可以实现对用户访问的某一类网站的控制。既可以是FW自带的预定义分类,也可以是管理员配置的自定义分类。 组网需求 如图1所示,FW作为企业网关部署在网络…

华为OD机试【城市聚集度】(java)(200分)

1、题目描述 一张地图上有N个城市,城市和城市之间有且只有一条道路相连,要么直接相连,要么通过其他城市中转相连(可中转一次或多次)。城市与城市之间的道路都不会成环。 当切断通往某城市i的所有道路后,地图上将分成多个连通的城…

mongoDB分组查询

完整代码 //根据医院编号 和 科室编号 &#xff0c;查询排班规则数据Overridepublic Map<String, Object> getRuleSchedule(long page, long limit, String hoscode, String depcode) {//1 根据医院编号 和 科室编号 查询Criteria criteria Criteria.where("hosco…

云手机:海外舆情监控的新工具

在数字化时代&#xff0c;海外舆情监控对于企业、品牌和政府机构来说&#xff0c;已经变得至关重要。传统的舆情监控方法往往受限于地域、设备和技术&#xff0c;而云手机的出现&#xff0c;为海外舆情监控带来了全新的解决方案。 一、云手机与海外舆情监控的完美结合 云手机作…

Flask 通过SQLAlchemy连接mySQL实现一个实用的用户管理功能

Flask 通过SQLAlchemy连接mySQL实现一个实用的用户管理功能 安装配置 首先确保已经安装如下程序&#xff1a; flask&#xff1a;用于构建web应用程序。flask-sqlalchemy&#xff1a;用于在 Flask 中连接 MySQL 数据库&#xff0c;通过pip install flask-sqlalchemy安装。pym…

Web安全:SQL注入漏洞详解,SQL注入常见功能、危害、分类、判断注入点、注入方式

「作者简介」:2022年北京冬奥会网络安全中国代表队,CSDN Top100,就职奇安信多年,以实战工作为基础对安全知识体系进行总结与归纳,著作适用于快速入门的 《网络安全自学教程》,内容涵盖系统安全、信息收集等12个知识域的一百多个知识点,持续更新。 这一章节我们需要知道S…

FPGA+炬力ARM实现VR视频播放器方案,3D眼镜显示

3D眼镜显示&#xff1a; FPGA炬力ARM方案&#xff0c;单个视频源信号&#xff0c;同时驱动两个LCD屏显示&#xff0c;实现3D 沉浸式播放 客户应用&#xff1a;VR视频播放器 主要功能&#xff1a; 1.支持多种格式视频文件播放 2.支持2D/3D 效果实时切换播放 3.支持TF卡/U盘文…

24数维杯C题18页保姆级思路+代码+后续参考论文

18页保姆级思路&#xff1a; 24数维杯C题20页保姆级思路&#xff0b;可执行代码&#xff0b;参考论文 简单麦麦https://www.jdmm.cc/file/2710641/ 群&#xff1a;666165284 1&#xff09;确定天然气水合物资源分布范围 要确定天然气水合物资源的分布范围&#xff0c;需要分…

谷歌上架,白包号放着备用,啥也没干也被封?是什么情况?

众所周知&#xff0c;Google Play Store是全球最大的应用商店之一&#xff0c;每天都有大量的应用被上传和下架。 同时&#xff0c;随着谷歌上架行业的发展&#xff0c;谷歌现在的审核系统越来越智能和先进&#xff0c;开发者们尝试着各种方法来提高上架成功率。其中&#xff…

提升工作效率的秘密武器

&#x1f31f;工作小能手们&#xff0c;你们是否还在为日复一日的办公琐事感到头疼&#xff1f;别急&#xff0c;今天我就为大家种草几款鲜为人知但超级实用的工作软件&#xff0c;让你的工作效率飞起来&#xff01;&#x1f308; 1️⃣《亿可达》 &#x1f5a5;️ 它是一款自…

Windows系统本地部署DrawDB数据库设计工具并实现无公网IP远程访问

文章目录 1. Windows本地部署DrawDB2. 安装Cpolar内网穿透3. 实现公网访问DrawDB4. 固定DrawDB公网地址 开发中很多时候都会使用到数据库&#xff0c;所以选择一个好用的数据库设计工具会让工作效率翻倍。在当今数字化时代&#xff0c;数据库管理是许多企业和个人项目的核心。设…