Я только что начал изучать модули C++ для Python с помощью SWIG и CMake.
Looking at 'UseSWIG' documentation, it seem it's possible to have CMake auto-include e.g из моего простого теста "привет, мир". Но я пока не смог добиться в этом успеха без необходимости добавлять %include std_string.i
в мой файл 'Привет, я'.
Со следующим (который я просто вырезал из github обс-питон), добавленным в мой CMakeLists.txt:
SET_SOURCE_FILES_PROPERTIES(hello.i PROPERTIES SWIG_FLAGS "-modern")
SET_SOURCE_FILES_PROPERTIES(hello.i PROPERTIES SWIG_FLAGS "-builtin")
SET_SOURCE_FILES_PROPERTIES(hello.i PROPERTIES SWIG_FLAGS "-modernargs")
SET_SOURCE_FILES_PROPERTIES(hello.i PROPERTIES SWIG_FLAGS "-includeall")
SET_SOURCE_FILES_PROPERTIES(hello.i PROPERTIES SWIG_FLAGS "-importall")
SET_SOURCE_FILES_PROPERTIES(hello.i PROPERTIES SWIG_FLAGS "-py3")
После этого будет казаться, что библиотека компилируется нормально, без необходимости добавлять %include std_string.i
. Однако попытка использовать встроенный модуль в Python приведет к:
<Swig Object of type 'std::string *' at 0x7fb743896270>
swig/python detected a memory leak of type 'std::string *', no destructor found.
Мне интересно, захочет ли кто-нибудь привести краткий пример того, чего может не хватать.
Или действительно необходимо включить std_string.i в мой hello.i независимо от того, включен ли <string>
в мой заголовок C++?
(Без любого из этих двух make, как и ожидалось, сообщит, что <string>
не может быть найден.)
std_string.i
содержит карты типов, необходимые SWIG для понимания std::string
. Вы должны включить его в файл .i
, если вы обертываете функции, использующие std::string
, иначе SWIG просто сгенерирует непрозрачные оболочки для объектов, которые он не понимает (например, Swig Object of type 'std::string *'
).
Обратите внимание, что обычно не надо хочет использовать -includeall
или -importall
. Обычно вы не хотите создавать оболочки SWIG для каждого класса и функции рекурсивно.
'Обратите внимание, что обычно не надо хочет использовать -includeall или -importall'. Я буду иметь это в виду. Спасибо.