使用SWIG的C ++的Python包装器。无法识别参数类型

问题描述 投票:1回答:1

我正在尝试在Linux上使用SWIG围绕C ++代码构建Python包装器,但不确定包装器是否正确创建。例如,这是一个小问题(在我的较大项目中)。

假设我有一个名为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输入文件:

message.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++

命令提示符下的所有三个步骤都通过了,在终端上没有任何错误,并且生成了以下文件而没有任何抱怨:

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

然后我尝试通过在Linux终端上输入以下命令(位于同一目录中)来测试Python包装器:

$ 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,但它崩溃了。因此看来出了点问题。有人可以指导我问题出在哪里吗?

python c++ wrapper swig
1个回答
1
投票

您的声明和实现不匹配(缺少const),应该导入message而不是_message。所有这些,您所缺少的是:

%include "std_string.i"

在包含message.hpp的.i中。这将提供将Python str转换为C ++ std::string所需的类型映射。

© www.soinside.com 2019 - 2024. All rights reserved.