GNURadio C++流图用OOT块编译报错及代码被覆盖问题求助
解决GNURadio流图自动覆盖自定义修改的问题
核心背景
GNURadio Companion(GRC)每次运行或重新生成流图时,会完全重写自动生成的.cpp、.hpp和CMakeLists.txt文件,直接修改这些文件的内容必然会被覆盖,必须从GRC配置或代码架构层面解决。
可行解决方案
1. 禁用GRC自动重写代码功能
- 打开目标流图,点击顶部菜单栏的 Flow Graph -> Generate Options
- 在弹出窗口中,取消勾选 Regenerate C++ code on run
- 效果:后续点击运行时,GRC仅编译现有代码,不会重新生成覆盖你的修改。注意:若调整流图拓扑(增减块、修改连线),需手动重新生成代码并迁移之前的自定义修改。
2. 封装自定义逻辑到独立OOT块(推荐)
这是GNURadio开发的规范做法,从根源避免修改自动生成代码:
- 针对
std::vector重定义问题:将复用变量、自定义逻辑封装到自己的OOT块的类成员或专属头文件中,不要在流图自动生成的文件里定义。 - 针对类成员未声明问题:确保C++ OOT块的
.xml元数据文件正确配置了块的参数、端口和依赖项,GRC生成流图代码时会自动在.hpp中添加对应的类成员声明。 - 操作步骤:
- 使用
gr_modtool创建新OOT模块,将自定义逻辑写入模块的.cpp和.h文件 - 编辑模块的
.xml文件,准确描述块的输入输出端口、参数、编译依赖 - 编译安装OOT模块后,直接在GRC中调用该块,无需修改自动生成的流图代码
- 使用
3. 修改GRC代码生成模板(进阶)
若需要GRC自动生成符合需求的代码,可修改默认模板:
- 找到GRC的C++模板路径(通常在
/usr/share/gnuradio/grc/templates/cpp或GNURadio安装目录下) - 编辑
block.cpp.tmpl、block.hpp.tmpl等模板文件,添加所需的变量声明或避免重定义的逻辑 - 注意:此修改会影响所有GRC生成的流图,操作前务必备份原模板文件
内容的提问来源于stack exchange,提问作者Naman chaudhary
相关产品推荐
相关产品推荐

