簡體   English   中英

用 SWIG 包裝共享指針 object 不能訪問 class 成員函數

[英]Wrapping shared pointer object with SWIG don't give access to class member functions

我有一個管理相機對象列表的 C++ CameraManager class。 攝像機對象由 std::list 管理,作為共享指針,即每個列表項的類型為:shared_ptr < Camera >。

我可以從 CameraManager object 獲得相機

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

使用 Swig 創建一個 Python 模塊,上面轉換為 python 代碼為:

  camera = cameraManager.getCamera()

但是,上面的相機 Python object 不允許我訪問任何相機類功能。 Python 說是一個 object 類型:'Swig object 類型為 'std::shared_ptr *' 在 ####

在 Swig 接口文件中添加以下內容

%include <std_shared_ptr.i>
%shared_ptr(Camera)

在包括之前

%include "aiCamera.h"

不要更改生成的 Python 模塊中的行為。 有什么想法可能會丟失嗎?

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

typedef CameraSP std::shared_ptr<Camera>;

相機 class 是從一個基本為空的 class 派生的。

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 模塊開始按預期工作。

上面的問題是處理來自 Allied Vision 的 C/C++ API,控制他們的相機。 他們定義了自己的共享指針class,並使用與std共享指針class相同的名稱命名,即shared_ptr。

此 API 的客戶端代碼使用 std::shared_ptr,並且在某些時候使用 shared_ptr,但未指定命名空間導致 Swig 出現上述問題。 通過在使用 shared_ptr 時顯式指定 std 命名空間,問題得到解決,並且使用共享指針生成的 swigged 對象開始正常工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM