Как не дать SWIG генерировать синтаксические ошибки для типов макросов (с ++ на python) - PullRequest
0 голосов
/ 28 июня 2019

Я довольно новичок в SWIG (и c ++) и пытаюсь обернуть что-то с именем p_convolve.hpp из библиотеки с именем evergreenforest в python (Вы можете проверить это здесь: https://bitbucket.org/orserang/evergreenforest/src/master/). Я не могу получить очень далеко, потому что SWIG выдает синтаксическую ошибку, когда достигает использования макроса, определенного в другом месте библиотеки. Я использую c ++ 11, python 2.7 и последнюю версию swig.

Я только начал, на самом деле еще не пытался обернуть и привести в порядок карты типов, просто хотел посмотреть, скомпилируется ли он, и я получил синтаксическую ошибку. Ошибка в строке, которая использует то, что я считаю, называется макросом, который определен в FLOAT_TYPE.hpp в утилитах для библиотеки. Я опубликую код для этого файла ниже, а также строку, которая вызывает ошибку. Я еще ничего не пробовал, потому что я не смог найти "macro" или "define" в документации по 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 

Мои ожидаемые или ожидаемые результаты состоят в том, что эта вещь сможет скомпилироваться в модуль - он не будет хорошим или полезным, пока я не получу таблицы типов и тому подобное, но просто чтобы избавиться от них. Синтаксические ошибки - это текущая цель. Заранее спасибо!

1 Ответ

1 голос
/ 28 июня 2019

SWIG не включается во включаемые файлы, включенные в файл верхнего уровня, на который ссылается %include, поэтому вам нужно специально %include другие файлы, для которых нужны определения.Это сделано намеренно ... обычно вы не хотите создавать интерфейсы для всего в <stdio.h> или <iostream> только потому, что они используются в вашем включаемом файле.

Так что вам, вероятно, нужно по крайней мере:

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

Если вы не хотите включать в свой интерфейс SWIG каждую вещь в float_type.hpp, вы можете, по крайней мере, предоставить определения, которые вам нужны:

typedef double FLOAT_TYPE;
%include "p_convolve.hpp"
...