是否可以从 C++ header(s) 中自动包含 CMake + SWIG + Python?

Is it possible to have CMake + SWIG + Python auto include from C++ header(s)?

我刚刚开始使用 SWIG 和 CMake 学习 Python 的 C++ 模块。

查看 'UseSWIG' 文档,似乎可以使用 CMake auto-include 例如 来自我的简单 "hello world" 测试。但是,到目前为止,如果不将 %include std_string.i 添加到我的 'hello.i' 文件,我无法成功

将以下 (我只是从 obs-python 的 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++ header 中?

(如果没有这两个中的任何一个,make 将如预期的那样声明无法找到 <string>。)

std_string.i 包含 SWIG 理解 std::string 所需的类型映射。如果包装使用 std::string 的函数,则必须将其包含在 .i 文件中,否则 SWIG 只会为其不理解的对象生成不透明的包装器(例如 Swig Object of type 'std::string *')。

请注意,您通常不想使用-includeall-importall。您通常不希望递归地为每个 class 和包含的函数生成 SWIG 包装器。