2016-11-14 7 views
1

У меня есть следующие файлы для генерации Python привязки к C++ проекта с SWIG и CMake:SWIG 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.so и test.py созданы. strings libtestcpp.so и strings _test.so обе имеют запись _Z3addii и import test работает в Python, но нет ничего под пространством имен test в Python.

Я также попытался вручную компиляции с

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.

+2

Я думаю, вам все еще нужно добавить строку '% включают в себя«test.h»' в конце в 'тесте. i'. –

+0

Это действительно правильно - я, кажется, полностью забыл об этом! – danielunderwood

+0

Я не был на 100% уверен, прежде чем комментировать. Я обратил свой комментарий к ответу. –

ответ

2

Вам нужно добавить строку %include "test.h" в конце в test.i

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

%include "test.h"