我对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
我对结果的期望或希望是能够将此东西编译成一个模块-在我获得类型映射等之前,它不是一个好或有用的东西,但是要摆脱这些语法错误是当前的目标。预先谢谢你!
答案 0 :(得分:1)
SWIG不会递归到%include
所引用的顶级文件中包含的包含文件,因此您需要专门%include
来定义文件。这是有意的……您通常不希望为<stdio.h>
或<iostream>
中的所有内容生成接口,只是因为它们在您的包含文件中使用了。
所以您可能至少需要:
%include "float_type.hpp"
%include "p_convolve.hpp"
如果您不想将float_type.hpp
中的所有内容都包含在SWIG界面中,则至少可以提供所需的定义:
typedef double FLOAT_TYPE;
%include "p_convolve.hpp"