Python Обертка вокруг C ++ с использованием SWIG. Тип аргумента не распознан - PullRequest
1 голос
/ 08 января 2020

Я пытаюсь создать оболочку Python вокруг кода C ++, используя SWIG на Linux, и я не уверен, правильно ли создается оболочка. Например, вот небольшая проблема (в рамках моего более крупного проекта).

Предположим, у меня есть файл с именем message. cpp

message. cpp

#include <iostream>

#include "message.hpp"

void warning (std::string message) {
  using std::cout;
    cout << "\n!! WARNING!  " << message << " !!\n";
}

Соответствующий заголовочный файл:

message.hpp

#include <string> 
#include <fstream>   // file I/O
#include <sstream>
#include <iostream>

void warning (const std::string message);

Чтобы передать это через SWIG, у меня есть следующий входной файл SWIG:

сообщение. i

%module message

%{
#include "message.hpp"
%}

%include "message.hpp"

Из терминала Linux я создаю оболочку, используя следующие команды:

$ swig -c++ -python message.i

$ g++ -fpic -c message.hpp message_wrap.cxx message.cpp -I/usr/include/python2.7/ -I/usr/include

$ gcc -shared message_wrap.o message.o -o _message.so -lstdc++

Все 3 шага в командной строке проходят без ошибок на терминале и Следующие файлы создаются без каких-либо жалоб:

message_wrap.cxx
message_wrap.o
message.o
message.py
message.hpp.gch
_message.so

Затем я пытаюсь протестировать оболочку Python, введя следующие команды на терминале Linux (оставаясь в том же каталоге):

$ python
Python 2.7.17
[GCC 7.4.0] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import _message
>>> _message.warning("SampleMessage")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: in method 'warning', argument 1 of type 'std::string const'

Я ожидал, что он просто отобразит строку WARNING! SampleMessage на терминале, но вместо этого произойдет сбой. Похоже, что-то пошло не так. Может кто-нибудь направить меня, где проблема, пожалуйста?

1 Ответ

1 голос
/ 08 января 2020

Ваша декларация и реализация не совпадают (отсутствует const), и вы должны импортировать message, а не _message. Все, что сказано, что вам не хватает:

%include "std_string.i"

в вашем .i до включения message.hpp. Это обеспечит карты типов, необходимые для преобразования Python str в C ++ std::string.

...