SWIG Python绑定似乎是空的

时间:2016-11-14 21:41:24

标签: python c++ swig

我有以下文件用于使用SWIG和CMake生成与C ++项目的Python绑定:

test.h

int add(int a, int b);

TEST.CPP

int add(int a, int b)
{
        return a+b;
}

test.i

%module test
%{
#include "test.h"
%}

的CMakeLists.txt

cmake_minimum_required(VERSION 2.6)
project(swig-test)

# This is a CMake example for Python

add_library(testcpp SHARED test.cpp)

FIND_PACKAGE(SWIG REQUIRED)
INCLUDE(${SWIG_USE_FILE})

FIND_PACKAGE(PythonLibs)
INCLUDE_DIRECTORIES(${PYTHON_INCLUDE_PATH})

INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR})

SET(CMAKE_SWIG_FLAGS "")

SET_SOURCE_FILES_PROPERTIES(test.i PROPERTIES CPLUSPLUS ON)
SET_SOURCE_FILES_PROPERTIES(test.i PROPERTIES SWIG_FLAGS "-includeall")
set(${CMAKE_CXX_FLAGS} "${CMAKE_CXX_FLAGS} -fPIC")
SWIG_ADD_MODULE(test python test.i)
SWIG_LINK_LIBRARIES(test testcpp)

成功编译并创建libtestcpp.so_test.sotest.pystrings libtestcpp.sostrings _test.so都有一个条目_Z3addiiimport test在Python中工作,但在Python的test命名空间下没有任何内容。

我也尝试用

手动编译
swig -c++ -python test.i
g++ -c -fpic test.cpp test_wrap.cxx -I/usr/include/python2.7 -I.
g++ -shared test.o test_wrap.o -o _test.so

具有相同的结果。

注意import test不是完全空模块可能很有用; import test; dir(test)产生

['__builtin__',
 '__builtins__',
 '__doc__',
 '__file__',
 '__name__',
 '__package__',
 '_newclass',
 '_object',
 '_swig_getattr',
 '_swig_property',
 '_swig_repr',
 '_swig_setattr',
 '_swig_setattr_nondynamic',
 '_test']

import test; help(test)描述了它是由SWIG创建的。

1 个答案:

答案 0 :(得分:2)

您需要在test.i

的末尾添加一行%include "test.h"
%module test
%{
#include "test.h"
%}

%include "test.h"