开发GNU Radio模块遇到的其它问题
告别修改howto模块的历史
相信很多人在看完GNU Radio模块开发方面的文档之后,会出现“好麻烦啊”这样的想法。这也难怪,光是教学性质的gr-howto-write-a-block模块,就拥有7个子目录,108个文件。所以有一些同学是直接通过修改howto模块来开发自己的模块的,以此来减少一些体力劳动。
好在在CGRAN上收集的项目中,我发现了这个方便的工具devtools:
This project aims to provide tools, helper, scripts and scriplets to aid the development of GNU Radio.
简而言之,devtools通过提供名为modtool.py的工具,为各位开发者提供了一个快速生成模块骨架的手段。关于这个工具的简要介绍,可以参考这里,余下部分将简要介绍如何生成一个source模块的。
安装
- 想要获得最新版本的话,请从其项目主页(github)上下载最新版本的gr_modtool.py文件即可。注意,只需要这一个python文件即可;
- 把gr_modtool.py文件扔到PATH中的一个路径即可,如此既安装完毕。
使用工具自动生成模块框架
- 切换到合适的路径,比如~/Workspace/
- 生成(Module),假如你决定将自己的Module命名为PT,那么运行
gr_modtool.py create PT
之后,可以在当前路径下看到子目录gr-PT
,结构如图一所示; - 为Module添加Block(信号处理的模块),这一步才是最关键的步骤。如前文所述,我们假设现在要添加一个信号源模块,于是运行
gr_modtool.py add -d gr-PT/ -n PT -N simple_source -t source
,其中add
表示向PT module中添加block,而PT
则是module名,simple_source
表示需要添加的block名,-t source
表示添加的block类型是一个源; - 回车之后会要求输入参数列表(argument list),也就是block构造函数的参数列表,在这里我们输入
int frequency
。其实输入参数带默认值也是可以的,比如int val1, double val2=0
; - 之后还会询问是否需要生成Python或者C++的qa文件,一路回车即可;
- 如此便大功告成,比如在
lib
路径下会多出PT_simple_source.cc
和qa_PT_simple_source.cc
两个文件,而其它的相关文件也会被悉数添加。不仅如此,最贴心的功能莫过于各种源文件中需要修改的地方都加了Vim的place holder,如图二所示。
[](/img/new_module_structure.jpg) |
图一 PT module文件结构 |
[](/img/place_holder.jpg) |
图二 贴心的place holder |
编译模块可能遇到的问题
之前在编译gr-chancoding模块的时候,还遇到过一个比较常见的问题,./configure时:
checking Python.h usability
result: no
checking Python.h presence
result: no
checking for Python.h
result: no
error: cannot find usable Python headers
但是诡异的是Python.h平躺在/usr/include/python2.7/下,并且configure脚本已经找到了这个路径。于是翻了下config.log,终于发现问题是:
fatal error: asm/errno.h: No such file or directory
好吧,谁叫我没更新Ubuntu,又遇到这个老朋友了Bug 48879 - Compilation cannot find file asm/errno.h。之后只管./configure CFLAGS="-I /usr/include/i386-linux-gnu/"
即可。
第三方module加载失败
在make, make install都顺利通过之后,决定打开ipython手工加载chancoding模块试试,结果在执行import chancoding
时获得如下错误信息:
libgnuradio-chancoding.so.0: cannot open shared object file: No such file or directory
难道Python找不到/usr/local/lib
这个路径吗…因为之前./configure
的时候没有指定--prefix
,那么module的安装路径就应该是/usr/local/
当中,解决方法就是:
export LD_LIBRARY_PATH=”/usr/local/lib”这一行加到
~/.bashrc
当中即可。