2016-01-28 47 views
0

我是SWIG的新手,所以我完全沒有經驗,但我真的很想使用Riftek LASER的SDK(https://riftek.com/media/rit/SDK/RFDevice_SDK.zip)。SWIG一個SDK到Python

SDK本身包含一些頭文件,dll和def文件。我寫了下面的呷文件到現在爲止:

/* rfdevice.i */ 
%module rfdevice 
%{ 
#include <windows.i> 
#include <typemaps.i> 
#include "include/RF625Device.h" 
#include "include/RF625Device_Legacy.h" 
#include "include/RFDevice.h" 
#include "include/RFEthernetDetector.h" 
#include "include/RFEthernetDevice.h" 
#include "include/RFQDPMotorDevice.h" 
#include "include/RFSerialDevice.h" 
#include "include/RFString.h" 
#include "include/RFTypeDefs.h" 
#include "include/serial.h" 
%} 
%include <windows.i> 
%include <typemaps.i> 

%apply void *INPUT {void *lpResultBuffer}; 
%apply float *OUTPUT {float *lpPointsBuffer}; 
%apply USHORT *OUTPUT {USHORT *lpCount}; 

%include "include/RFString.h" 
%include "include/serial.h" 
namespace RFDevice { 
    %include "include/RFTypeDefs.h" 
    %include "include/RFEthernetDetector.h" 
    %include "include/RFDevice.h" 
    %include "include/RFEthernetDevice.h" 
    %include "include/RFQDPMotorDevice.h" 
    %include "include/RFSerialDevice.h" 
    %include "include/RF625Device_Legacy.h" 
    %include "include/RF625Device.h" 
} 

我可以產生rfdevice_wrap.c文件,但我不能編譯它,因爲我得到了很多的來自編譯器的未定義的引用。

我的問題是: - 我必須以某種方式將dll或def文件包含在i文件中嗎? - 是否有更快/更簡單的方式讓SDK能夠與Python協同工作?

我在Windows 7 64位下使用g ++編譯MinGW。


到目前爲止,我設法確定了我的真正問題。我根據當前狀態修改了問題。

有一個在頭一個下面的函數定義:

USHORT ConvertResultToPoints(void IN *lpResultBuffer, float OUT *lpPointsBuffer, USHORT OUT *lpCount, USHORT *lpMeasureCnt = NULL, USHORT *lpPacketCnt = NULL, BOOL bChecksumCheck = FALSE); 

這裏的「IN」和「OUT」是造成了一些SWIG truble。我不斷收到以下編譯器錯誤:

include\RF625Device_Legacy.h(259): Error: Syntax error in input(3). 

在自變量處理下的SWIG文檔中存在該問題的可能解決方案。我已經將它包含在i文件中,但我一直在收到編譯器錯誤。

+0

你應該在這裏包含來自編譯器/鏈接器的錯誤消息,請參閱[mcve] –

+1

爲什麼使用g ++編譯* .c文件? –

+1

沒有辦法在i(接口)文件中包含dll/def文件,但編譯代碼時必須包含它們 –

回答

0

你可以這樣開始。我使用CMake

這是我的CMakeLists.txt文件。我可以創建RFString對象到目前爲止

cmake_minimum_required(VERSION 2.8.9) 

find_package(SWIG REQUIRED) 
include(${SWIG_USE_FILE}) 

find_package(PythonLibs REQUIRED) 

include_directories(${PYTHON_INCLUDE_PATH}) 
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include) 

set_source_files_properties(RFDevice_SDK.i PROPERTIES CPLUSPLUS ON) 

set(DEPS_PREFIX ${CMAKE_SOURCE_DIR}/linux) 

link_directories(${DEPS_PREFIX}) 

set(RFDEVICE_LIBS_NAMES RFDevice3) 

foreach(lib ${RFDEVICE_LIBS_NAMES}) 
    find_library(
    ${lib}_LIB 
    NAMES ${lib} 
    PATHS ${DEPS_PREFIX} 
    PATH_SUFFIXES i386 x86_64 
) 
    set(RFDEVICE_LIBS ${RFDEVICE_LIBS} ${${lib}_LIB}) 
endforeach() 

message(${RFDEVICE_LIBS}) 

set(swig_rfdevice_sdk_HEADERS 
    ./include/linuxTypeDefs.h 
    ./include/RFString.h 
) 

set(swig_rfdevice_sdk_SOURCES 
) 

swig_add_module(swig_rfdevice_sdk python RFDevice_SDK.i ${swig_rfdevice_sdk_HEADERS} ${swig_rfdevice_sdk_SOURCES}) 

swig_link_libraries(swig_rfdevice_sdk ${RFDEVICE_LIBS} ${PYTHON_LIBRARIES}) 

這裏是.o文件將

%module(docstring="This is a Python wrapper for RFDevice3") swig_rfdevice_sdk 
#pragma SWIG nowarn=320 
%{ 

    #define SWIG_FILE_WITH_INIT 
    // Try to ignore cast between pointer-to-function and pointer-to-object 
    #include "stdint.h" 
    #include "linuxTypeDefs.h" 
    #include "RFString.h" 
%} 

#ifdef _SWIG_WIN32 
%include "windows.i" 
#endif 

%include "carrays.i" 
%array_class(char, charArrayClass); 
%array_functions(char, charArray); 

// Individual modules 
%include "linuxTypeDefs.h" 
%include "RFString.h" 

我必須安裝舊版本的glibC++,使其工作。或者,您可以鏈接到舊版本的glibC++。

+0

判斷接口是如何創建的,我會用ctypes來代替,並在Python中創建具有相同二進制佈局的結構,並簡單地調用它們。 –