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] 삭제
몇 마디 만하겠습니다