У меня есть следующие файлы для генерации 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.
Я думаю, вам все еще нужно добавить строку '% включают в себя«test.h»' в конце в 'тесте. i'. –
Это действительно правильно - я, кажется, полностью забыл об этом! – danielunderwood
Я не был на 100% уверен, прежде чем комментировать. Я обратил свой комментарий к ответу. –