是否可以从 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 包装器。
我刚刚开始使用 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 包装器。