使用 swig 时出错:输入中的语法错误 (1)
Error using swig: Syntax error in input(1)
我对 swig 还比较陌生,我遇到了一个我找不到的错误。错误是:
/home/investigador/OMICRON-GNURadio/gr-freqAdaptiveOFDM/swig/../include/freqAdaptiveOFDM/mapper.h:39: 错误:输入语法错误(1).
错误所在的文件是这样的:
#ifndef INCLUDED_FREQADAPTIVEOFDM_SIGNAL_FIELD_H
#define INCLUDED_FREQADAPTIVEOFDM_SIGNAL_FIELD_H
#include <freqAdaptiveOFDM/api.h>
#include <gnuradio/digital/packet_header_default.h>
namespace gr {
namespace freqAdaptiveOFDM {
class FREQADAPTIVEOFDM_API signal_field : virtual public digital::packet_header_default
{
public:
typedef boost::shared_ptr<signal_field> sptr;
static sptr make();
protected:
signal_field();
};
} // namespace freqAdaptiveOFDM
} // namespace gr
#endif /* INCLUDED_FREQADAPTIVEOFDM_SIGNAL_FIELD_H */
发现错误的行是classFREQADAPTIVEOFDM_API行。
在此先感谢您的帮助!
顺便说一下,我的 swig 文件如下:
#define freqAdaptiveOFDM_API
#define DIGITAL_API
%include "gnuradio.i"
%include "freqAdaptiveOFDM_swig_doc.i"
%{
#include "freqAdaptiveOFDM/mapper.h";
#include "freqAdaptiveOFDM/signal_field.h"
%}
%include "gnuradio/digital/packet_header_default.h"
%include "freqAdaptiveOFDM/mapper.h"
%include "freqAdaptiveOFDM/signal_field.h"
GR_SWIG_BLOCK_MAGIC2(freqAdaptiveOFDM, mapper);
%template(signal_field_sptr) boost::shared_ptr<gr::freqAdaptiveOFDM::signal_field>;
%pythoncode %{
signal_field_sptr.__repr__ = lambda self: "<signal_field>"
signal_field = signal_field.make;
%}
这很可能是因为 FREQADAPTIVEOFDM_API
未在您的 SWIG 界面中的任何位置定义。
删除错误的大写
#define freqAdaptiveOFDM_API
并将其替换为
#define FREQADAPTIVEOFDM_API
在你的 .i 文件的顶部应该可以安全地解决这个问题。
您似乎手动修改了部分包含文件并将其破坏。
我可以在下面列出一些潜在的问题,但老实说:
只需使用 gr_modtool
创建一个干净的模块,然后 gr_modtool add
您想要的块的所有存根,然后只需复制您需要的实际方法和字段 – 留下 #includes
一个人,只要你真的不明白他们在做什么。
所以,问题:
- 您有一个名为 mapper.h 的文件,但它有一个包含保护,显然是从另一个文件
#ifndef INCLUDED_FREQADAPTIVEOFDM_SIGNAL_FIELD_H
复制和粘贴的。这意味着在某些情况下,只有一个文件是 "relevant",而另一个文件基本上被视为空文件!维基百科 "include guard".
- 您的
#define freqAdaptiveOFDM_API
应该正确大写。您是否可能复制并粘贴内容或整个文件,然后使用不区分大小写的自动搜索和替换原始模块名称?你可能不小心弄坏了很多东西。基本上,C 预处理器和 C++ 语言中的所有内容都是区分大小写的。
#define DIGITAL_API
看起来不安全——我同意 Flexo,有必要在你的 swig 文件中定义 MODULENAME_API 宏,但只适用于你自己的模块——我不太确定为什么你在这里需要这个,但我想没有它就没有东西。所以也许您想从您使用的数字 API 中对类型进行前向定义?不过不太确定——可能在某些情况下这是有效的。
我对 swig 还比较陌生,我遇到了一个我找不到的错误。错误是:
/home/investigador/OMICRON-GNURadio/gr-freqAdaptiveOFDM/swig/../include/freqAdaptiveOFDM/mapper.h:39: 错误:输入语法错误(1).
错误所在的文件是这样的:
#ifndef INCLUDED_FREQADAPTIVEOFDM_SIGNAL_FIELD_H
#define INCLUDED_FREQADAPTIVEOFDM_SIGNAL_FIELD_H
#include <freqAdaptiveOFDM/api.h>
#include <gnuradio/digital/packet_header_default.h>
namespace gr {
namespace freqAdaptiveOFDM {
class FREQADAPTIVEOFDM_API signal_field : virtual public digital::packet_header_default
{
public:
typedef boost::shared_ptr<signal_field> sptr;
static sptr make();
protected:
signal_field();
};
} // namespace freqAdaptiveOFDM
} // namespace gr
#endif /* INCLUDED_FREQADAPTIVEOFDM_SIGNAL_FIELD_H */
发现错误的行是classFREQADAPTIVEOFDM_API行。 在此先感谢您的帮助!
顺便说一下,我的 swig 文件如下:
#define freqAdaptiveOFDM_API
#define DIGITAL_API
%include "gnuradio.i"
%include "freqAdaptiveOFDM_swig_doc.i"
%{
#include "freqAdaptiveOFDM/mapper.h";
#include "freqAdaptiveOFDM/signal_field.h"
%}
%include "gnuradio/digital/packet_header_default.h"
%include "freqAdaptiveOFDM/mapper.h"
%include "freqAdaptiveOFDM/signal_field.h"
GR_SWIG_BLOCK_MAGIC2(freqAdaptiveOFDM, mapper);
%template(signal_field_sptr) boost::shared_ptr<gr::freqAdaptiveOFDM::signal_field>;
%pythoncode %{
signal_field_sptr.__repr__ = lambda self: "<signal_field>"
signal_field = signal_field.make;
%}
这很可能是因为 FREQADAPTIVEOFDM_API
未在您的 SWIG 界面中的任何位置定义。
删除错误的大写
#define freqAdaptiveOFDM_API
并将其替换为
#define FREQADAPTIVEOFDM_API
在你的 .i 文件的顶部应该可以安全地解决这个问题。
您似乎手动修改了部分包含文件并将其破坏。
我可以在下面列出一些潜在的问题,但老实说:
只需使用 gr_modtool
创建一个干净的模块,然后 gr_modtool add
您想要的块的所有存根,然后只需复制您需要的实际方法和字段 – 留下 #includes
一个人,只要你真的不明白他们在做什么。
所以,问题:
- 您有一个名为 mapper.h 的文件,但它有一个包含保护,显然是从另一个文件
#ifndef INCLUDED_FREQADAPTIVEOFDM_SIGNAL_FIELD_H
复制和粘贴的。这意味着在某些情况下,只有一个文件是 "relevant",而另一个文件基本上被视为空文件!维基百科 "include guard". - 您的
#define freqAdaptiveOFDM_API
应该正确大写。您是否可能复制并粘贴内容或整个文件,然后使用不区分大小写的自动搜索和替换原始模块名称?你可能不小心弄坏了很多东西。基本上,C 预处理器和 C++ 语言中的所有内容都是区分大小写的。 #define DIGITAL_API
看起来不安全——我同意 Flexo,有必要在你的 swig 文件中定义 MODULENAME_API 宏,但只适用于你自己的模块——我不太确定为什么你在这里需要这个,但我想没有它就没有东西。所以也许您想从您使用的数字 API 中对类型进行前向定义?不过不太确定——可能在某些情况下这是有效的。