在GNU Radio中创建OOT模块,先用gr_modtool newmod mymod,创建一个module,再gr_modtool add myblock,创建一个block。有时还需要全局变量,由各个模块共享,这时,可以创建全局变量的global_vars.h头文件和相应的global_vars.cc文件,有两种方法:
- 在include/下添加global_vars.h文件,在lib/下添加global_vars.cc文件
- 将global_vars作为模块导入
方法一:手动添加文件
当只含有h文件时
- 只能定义const变量
- 函数定义需要加上inline或static
否则在编译时,会出现在myblock.cc和global_vars.cc重复定义函数或变量的错误。 - 此时make, make install会成功,运行grc流图或py文件,也会成功。
当含有h文件和cc文件时
- h文件中只能定义const变量,非const变量只能用extern声明,cc中定义
- h文件中函数定义需要加上inline或static,若不加,用extern声明,cc中定义
否则在编译时,会出现在myblock.cc和global_vars.cc重复定义函数或变量的错误。 - 此时make, make install会成功,但运行grc流图或py文件时,会有AttributeError: ‘module’ object has no attribute 'xxxx’的错误,这时,需要在lib/cmakelist.txt中, 加入 global_vars.cc文件,再次make,重新打开GRC。
方法二:将global作为模块导入
将global_vars作为noblock导入,注意的问题和“当含有h文件和cc文件时”类似,但注意此时include/cmakelist.txt中已含有global_vars.h,lib/cmakelist.txt中已含有 global_vars.cc文件,grc/中也有相应的xml文件(均为系统自动生成)。但运行grc流图或py文件时,会有AttributeError: ‘module’ object has no attribute 'xxxx’的错误,这时需要在swig/xxx_swig.i中删除"%include global_vars.h"这一行,再次make,重新打开GRC。
小结
- 在cmakelist.txt添加一些内容,主要是为了便于swig进行连接。
- include/cmakelist.txt中是否含有global_vars.h对两种方法没看出有什么影响,只影响/usr/local/include/mymod中是否含有global_vars.h