[英]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.