GNU Radio源代码编译安装
文章介绍了如何在 Docker 容器中创建构建环境,从源代码构建安装 GNU Radio。使用的开发环境为:
- 宿主机:Manjaro Linux 24.1.2
- Docker:27.2.1
- GNU Radio:3.10.11.0
GNU Radio 介绍
GNU Radio 是一个开源免费的软件开发工具包,提供信号处理模块来实现软件无线电1。可以与现有的低成本外部RF硬件一起使用,创建软件定义无线电,或者在模拟环境中脱离硬件使用。它广泛用于研究、工业、学术界、政府和业余爱好者环境,支持无线通信研究以及实际的无线电系统。
一般来说,大多数用户使用二进制安装的方式应该是足够的,尤其是对 GNU Radio 新手来说。然而,如果有特殊要求、想要最新版本或者二进制包无法安装到特殊环境,那么就可能想从源代码中安装GNU无线电。
注意:
- 默认配置下,GNU Radio 会被安装到系统的
/usr/local
文件夹下,可以在运行CMake
配置时通过设置-DCMAKE_INSTALL_PREFIX
参数指定安装到其他任意位置。- 运行和开发
out-of-tree
模块,不需要从源代码中安装 GNU Radio。- 本文不适用于 Raspberry Pi。
- 本文不适用于 conda。
基础容器配置
基础容器配置可以参考博文《manjaro安装使用docker》,主要步骤如下:
- 安装Docker,配置Docker国内镜像源。
- 拉取 archlinux 镜像,启动容器。
- 配置容器中的包管理工具使用国内镜像源。
- 创建普通用户并设置其权限。
- 安装终端 zsh,设置 zsh 主题。
启动容器
运行一下命令,以普通用户进入容器。
docker run -it --name gnuradio -u qicz archlinuxbase:1.0 /bin/zsh
进入容器后,最好更新一下包和系统,否则在安装依赖时容易出错。
# 切换到root更新
su
sudo pacman -Syyu
#切换回普通用户
su qicz
依赖安装
包括如下依赖:
- git
- gcc 编译器
- CMake 构建工
- boost C++ 准标准库
- gmp 任意精度算术运算库
- doxygen C++ 文档生成工具
- sdl1.2 2 音频、键盘、鼠标、游戏杆以及图形硬件的低级访问库
- gsl GNU 科学库,一个现代的数值计算库
- qwt 基于 Qt 的 2D 绘图库
- gambas3-gb-qt5-opengl qt5 的 OpenGL 组件
- log4cpp C++ 日志库
- zeromq 消息队列
- codec2 开源语音编解码器
- gsm 有损语音压缩的共享库
- libsndfile 音频数据采样文件读写库
- soapysdr 供应商和平台中立的软件定义无线电(SDR)支持库
- libiio 与 Linux 工业输入/输出 (IIO) 子系统的接口
-libad9361 用于滤波器设计和处理、多芯片同步等的 IIO AD9361 库
-spdlog C++ 日志库 - libuhd 通用软件无线电外设(USRP)用户空间驱动程序。
- libvolk 来自 GNU Radio 的向量优化内核库
- gtk3 跨平台用户界面
- libcanberra 系统声音播放库
- libunwind 用于程序栈展开
- thrift IPC/RPC框架
- python和相关模块
- python-numpy python 科学工具
- python-mako python 模板库
- python-sphinx python 文档生成工具
- python-lxml libxml2和libxslt python接口
- python-pyqt5 qt5 python接口
- python-yaml libYAML python接口
- python-click 命令行工具库
- python-click-plugins click 扩展模块,允许通过 setuptools 扩展 CLI 命令
- python-scipy 数学,科学和工程库
- python-cairo cairo图像处理库 python 接口
- python-setuptools python 包管理库
- pybind11 轻量级 C++ 导出 python 接口库
- python-matplotlib 绘图库
- python-pygccxml C++ 声明导航框架
- python-pyqtgraph 科学绘图库
- python-packaging python 打包工具
- python-jsonschema JSON Schema库
- python-qtpy PyQt 和 PySide 兼容库
- python-pyzmq ZeroMQ python接口
- python-gobject GLib/GObject/GIO/GTK python接口
- python-thrift thrift python接口
sudo pacman -S git gcc cmake boost boost-libs gmp doxygen fftw sdl12-compat gsl qwt log4cpp zeromq codec2 gsm libsndfile soapysdr libiio libad9361 spdlog python-numpy python-mako python-sphinx python-lxml python-pyqt5 python-yaml python-click python-click-plugins python-scipy python-cairo python-setuptools python-matplotlib python-pygccxml python-pyqtgraph python-packaging python-jsonschema python-qtpy pybind11 python-pyzmq python-gobject libuhd libvolk gtk3 libcanberra libunwind thrift python-thrift
# libqt5opengl5-dev \ gambas3-gb-qt5-opengl
# gir1.2-gtk-3.0 \
# libusb-1.0-0 libusb-1.0-0-dev libudev-dev \
编译构建
下载源码
从 github 上拉取源代码,如果 github 访问速度太慢,可以使用gitee同步镜像
git clone https://github.com/gnuradio/gnuradio.git
cd gnuradio
git checkout v3.10.11.0
构建工程
mkdir build
cd build
cmake -DCMAKE_BUILD_TYPE=Release -DPYTHON_EXECUTABLE=/usr/bin/python ..
make -j$(nproc)
make test
sudo make install
运行测试
宿主机安装 xhost3
安装 xhost
工具
# 宿主机
sudo pacman -S xhost
允许本地docker连接
xhost +local:docker
重启容器支持 GUI
要在容器中运行 GNU Radio 图形化程序,需要配置容器支持 GUI 程序。
# 宿主机
## 停止容器运行
docker stop gnuradio
## 将容器发布成镜像
docker commit -m "gnuradio 开发环境" gnuradio gnuradio:1.0
## 启动容器,支持x11,授予 /dev/dri 访问权限
docker run -it --name gnuradio --device /dev/dri -u qicz -e DISPLAY=$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix gnuradio:1.0 /bin/zsh
启动 gnuradio-companion 程序
# 容器
## 设置动态库加载路径和python模块路径,gnuradio 默认安装在 /usr/local
export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
export PYTHONPATH=/usr/local/lib/python3.12/site-packages:$PYTHONPATH
cd gnuradio/grc/scripts
## 运行 gtk 界面
./gnuradio-companion --gtk
## 运行 qt 界面
./gnuradio-companion --qt
链接
软件无线电的详细介绍可参考维基百科。简而言之,软件无线电是一种在软件中而不是使用专用集成电路硬件进行所需信号处理的无线电系统。好处是由于软件可以在无线电系统中轻松更换,相同的硬件可以用于创建许多不同通信标准的各种类型的无线电;因此,一个软件无线电可用于各种应用! ↩︎
Simple DirectMedia Layer 是一个跨平台开发库,旨在通过 OpenGL 和 Direct3D 提供对音频、键盘、鼠标、游戏杆以及图形硬件的低级访问。它被视频播放软件、模拟器和包括Valve获奖目录在内的许多 Humble Bundle 游戏所使用。 ↩︎
xhost
是一个用于控制 X Window System 服务器的客户端访问权限的命令行工具。它允许你指定哪些主机或用户可以连接到你的 X 服务器并执行图形操作。这对于在不同机器之间共享图形应用程序特别有用。 ↩︎