공유 포인터 개체를 SWIG로 래핑하면 클래스 멤버 함수에 대한 액세스 권한이 부여되지 않습니다.

토트 칼손

Camera 개체 목록을 관리하는 C ++ CameraManager 클래스가 있습니다. 카메라 객체는 공유 포인터로서 std :: list에 의해 관리됩니다. 즉, 각 목록 항목은 shared_ptr <Camera> 유형입니다.

CameraManager 개체에서 카메라를 얻을 수 있습니다.

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

Swig를 사용하여 Python 모듈을 만들 때 위의 내용은 다음과 같이 Python 코드로 변환됩니다.

  camera = cameraManager.getCamera()

그러나 위의 카메라 Python 객체는 Camera 클래스 함수에 액세스하는 것을 허용하지 않습니다. Python은 '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 모듈이 예상대로 작동하기 시작했습니다.

토트 칼손

위의 질문은 Allied Vision의 C / C ++ API를 다루면서 카메라를 제어하는 ​​것입니다. 그들은 자신의 공유 포인터 클래스를 정의하고 std 공유 포인터 클래스, 즉 shared_ptr과 같은 이름을 사용하여 이름을 지정했습니다.

이 API의 클라이언트 코드는 std :: shared_ptr을 사용하고 있으며, 어떤 시점에서 shared_ptr을 사용하면 네임 스페이스를 지정하지 않고 Swig에서 위의 문제를 일으켰습니다. shared_ptr을 사용할 때 std 네임 스페이스를 명시 적으로 지정하면 문제가 해결되고 공유 포인터를 사용하여 결과적으로 swigged 객체가 완벽하게 작동하기 시작했습니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관