使用SWIG包装共享指针对象无法访问类成员函数

5

我有一个 C++ CameraManager 类,管理一组 Camera 对象。 Camera 对象由 std::list 管理,作为 shared pointers 存储,即每个列表项的类型为:shared_ptr < Camera > 。

可以通过 CameraManager 对象获取 Camera:

 std::shared_ptr<Camera> c = cameraManager.getCamera();

使用Swig创建Python模块,以上内容将被翻译为Python代码如下:
  camera = cameraManager.getCamera()

上述的Python相机对象并不允许我访问任何相机类函数。Python指出它是一种类型为:“Swig object of type 'std::shared_ptr*' at ####” 的对象。
在Swig接口文件中添加以下内容:
%include <std_shared_ptr.i>
%shared_ptr(Camera)

在包含之前

%include "aiCamera.h"

不要改变生成的Python模块中的行为。有什么想法可能会丢失?

附加信息: C++代码使用typedef:

typedef CameraSP std::shared_ptr<Camera>;

相机类继承自一个基类,该基类基本为空。

class MVR_API MVRObject
{
public:
                                     MVRObject();
                                     MVRObject(const MVRObject& obj);
    virtual                         ~MVRObject();

};

代码使用VS 2013和CMake编译。 CMake的代码如下:

set_source_files_properties(${PyModule}.i PROPERTIES CPLUSPLUS ON)
set_source_files_properties(${PyModule}.i PROPERTIES SWIG_FLAGS "-threads")

SWIG_ADD_LIBRARY(${PyModule}
    TYPE MODULE 
    LANGUAGE python 
    SOURCES ${PyModule}.i
    )


SWIG_LINK_LIBRARIES (${PyModule}
    ${PYTHON_LIB_FOLDER}/Python37.lib    
    dslFoundation
    aimvr
)

# INSTALL PYTHON BINDINGS
# Get the python site packages directory by invoking python
execute_process(COMMAND python -c "import site; print(site.getsitepackages()[0])" OUTPUT_VARIABLE PYTHON_SITE_PACKAGES OUTPUT_STRIP_TRAILING_WHITESPACE)
message("PYTHON_SITE_PACKAGES = ${PYTHON_SITE_PACKAGES}")

SET(SWIG_RUNTIME ${CMAKE_CURRENT_BINARY_DIR}/mvr_swigpyrun.h)
execute_process(COMMAND ${SWIG_EXECUTABLE} -python -external-runtime ${SWIG_RUNTIME})

更新: 问题并不是Swig和共享指针的使用。问题出在第三方库中有其自己的shared_ptr实现。通过命名空间名称解决共享指针问题后,生成的Python模块按预期开始工作。


篮圈,编辑帖子。实际上是“%包括”。 - Totte Karlsson
1
有没有最小的完整示例可以重现这个问题?如果你已经展示了,我早就回答了,不需要悬赏。 - Flexo
Flexo说过...提供一个能够重现问题的示例会大大有助于获得答案。 - Mark Tolonen
曾经很乐意为解决方案提供赏金。然而,在创建一个简短的示例时,发现了问题。第三方库有自己的shared_ptr实现,并且使用了它的指令,导致两个共享指针类(名称相同(!),但命名空间不同)混在一起。构建时没有看到任何警告。 不确定如何处理这篇文章。也许将其写成答案可以帮助其他人? - Totte Karlsson
感谢@Flexo和Mark Tolonen提出创建一个小示例的建议。它帮助解决了问题! - Totte Karlsson
显示剩余2条评论
1个回答

2
上述问题涉及到使用Allied Vision的C/C++ API来控制他们的相机。他们定义了自己的共享指针类,并将其命名为与std shared pointer class相同的名称,即shared_ptr。
该API的客户端代码使用std::shared_ptr,在某些情况下,未指定命名空间使用shared_ptr会导致Swig出现上述问题。通过在使用shared_ptr时显式指定std命名空间,问题得以解决,使用共享指针的结果swigged对象开始正常工作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接