Обтекание объекта общего указателя с помощью SWIG не дает доступа к функциям-членам класса - PullRequest
5 голосов
/ 30 октября 2019

У меня есть класс C ++ CameraManager, который управляет списком объектов Camera. Объекты камеры управляются как std :: list как общие указатели, то есть каждый элемент списка имеет тип: shared_ptr .

Я могу получить камеру из объекта CameraManager как

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

При создании модуля Python с использованием Swig вышеприведенный код переводится в код Python следующим образом:

  camera = cameraManager.getCamera()

Объект Python камеры выше, однако, не позволяет мне получать доступ к каким-либо функциям классов Camera. ,Python говорит, что это объект типа: 'Swig объект типа' std :: shared_ptr * 'в ####

Добавление следующего в файл интерфейса Swig

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

перед включением

%include "aiCamera.h"

не меняйте поведение в получающемся модуле Python. Любые идеи, которые могут отсутствовать?

Дополнительная информация: Код C ++ использует typedef:

typedef CameraSP std::shared_ptr<Camera>;

Класс 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 начал работать, как и ожидалось.

1 Ответ

1 голос
/ 10 ноября 2019

Вопрос выше касается API C / C ++ от Allied Vision, который управляет их камерами. Они определили свой собственный класс общего указателя и назвали его, используя то же имя, что и класс общего указателя std, то есть shared_ptr.

Код клиента для этого API использует std :: shared_ptr, и в какой-то момент использование shared_ptr без указания пространства имен вызвало вышеуказанные проблемы со Swig. Путем явного указания пространства имен std при использовании shared_ptr проблемы были решены, и результирующие извлеченные объекты с использованием общих указателей начали работать отлично.

...