【问题标题】:How to stop SWIG from throwing Syntax Errors for type Macros (c++ to python)如何阻止 SWIG 抛出类型宏的语法错误(c++ 到 python)
【发布时间】:2019-06-27 23:34:10
【问题描述】:

我对 SWIG(以及 c++)还很陌生,我正在尝试将名为 p_convolve.hpp 的东西从名为 evergreenforest 的库包装到 python(您可以在此处查看:https://bitbucket.org/orserang/evergreenforest/src/master/)。我不能走得太远,因为 SWIG 在使用库中其他地方定义的宏时会引发语法错误。我正在使用 c++11、python 2.7 和最新版本的 swig。

我刚刚开始,实际上还没有尝试按顺序包装和获取类型映射,只是想看看它是否能编译,我得到一个语法错误。错误出现在使用我认为在库实用程序中的 FLOAT_TYPE.hpp 中定义的宏的行上。我将在下面发布该文件的代码,以及导致错误的行。我还没有尝试过任何事情,因为我在 swig 文档中找不到“宏”或“定义”,也不知道该怎么做。我也在使用 numpy.i,我还没有走得足够远来实际做任何事情,但如果任何解决方案也能很好地配合它,我将不胜感激。

//The macro, or at least that's what I think it's called, which is          
//included  in the problem file
#ifndef _FLOAT_TYPE_HPP
#define _FLOAT_TYPE_HPP

  #ifdef FAST_FLOAT
    typedef float FLOAT_TYPE;
  #else
    #ifdef ACCURATE_FLOAT
      typedef long double FLOAT_TYPE;
    #else
      // standard
      typedef double FLOAT_TYPE;
    #endif
  #endif

 #endif

导致问题的行来自 p_convolve.hpp:

const FLOAT_TYPE tau_denom(1e-9L);

.i 文件,p_convolve.i:

%module p_convolve
%include "std_vector.i"

%{
#define SWIG_FILE_WITH_INIT
#include "p_convolve.hpp"
#include <array>
#include <set>
#include "naive_convolve.hpp"
#include "fft_convolve.hpp"
#include "../Utility/FLOAT_TYPE.hpp"
%}

%include "numpy.i"

%init %{
import_array();
%}

%include "p_convolve.hpp"

最后,为了彻底,我编译的是什么:

swig -python -c++ p_convolve.i
g++ -fpic -c p_convolve_wrap.cxx -I/usr/include/python2.7 -I/home/sean/Desktop/SerangLab/Swig/numpy/numpy/core/include/ -I/home/sean/.local/lib/python2.7/site-packages/numpy/core/include/numpy/
g++ -shared p_convolve_wrap.o -o _p_convolve.so 

我期望或希望的结果是让这个东西能够编译成一个模块 - 。在我得到类型映射等之前它不会是一个好的或有用的,但只是为了摆脱这些语法错误是当前的目标。提前谢谢!

【问题讨论】:

    标签: c++ macros swig preprocessor


    【解决方案1】:

    SWIG 不会递归到包含在由 %include 引用的顶级文件中的包含文件,因此您需要专门 %include 您需要从中定义的其他文件。这是有意的...您通常不希望为 &lt;stdio.h&gt;&lt;iostream&gt; 中的所有内容生成接口,因为它们在您的包含文件中使用。

    所以你可能至少需要:

    %include "float_type.hpp"
    %include "p_convolve.hpp"
    

    如果您不想在您的 SWIG 界面中包含 float_type.hpp 中的所有内容,您至少可以提供您确实需要的定义:

    typedef double FLOAT_TYPE;
    %include "p_convolve.hpp"
    

    【讨论】:

    • 感谢您的解决方案!我试过了(得到了正确的文件路径和一切),但在那一行仍然出错。事实证明,它不喜欢将变量声明为 type varName(value) 而不是声明为 type varName = value。没有义务,因为您已经回答了我的主要问题,但是您是否碰巧知道它为什么不喜欢前一种方式/如何绕过它?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-09
    • 1970-01-01
    • 1970-01-01
    • 2016-08-17
    相关资源
    最近更新 更多