2015-04-01 2 views
1

У меня есть проект, над которым я работаю, для чего требуется использование подставки для подписи Topaz. В настоящее время наш продукт использует элемент управления ActiveX, предоставляемый Topaz для сбора подписей на веб-сайте, но мы пытаемся перейти к настольному приложению, основанному на Python. Python позволит нам разветвляться на несколько ОС без лишней дополнительной работы.Обтекание библиотеки C/C++ с помощью SWIG

Topaz предоставляет библиотеку 'C' (http://www.topazsystems.com/sigpluslibrary.html) для взаимодействия с их устройствами. Я считаю, что я решил, что это на самом деле C++ (использует классы и другие C++-конструкции). Я попытался создать оболочку для Python с помощью SWIG и Cython, но мне не повезло.

Моя структура каталогов для SWIG это:

  • SigSwig
    • Включает (содержит все заголовки из Топаз общей библиотеки C)
    • setup.py
    • SigLib.i
    • Подпись.i
    • и т.д.

Setup.py

# setup.py 
import distutils 
from distutils.core import setup, Extension 

module = Extension(
         "_SigLib", 
         ["SigLib.i"], 
         swig_opts=['-c++'], 
         language='c++', 
         library_dirs=['c:\Python27'], 
         libraries=["SigLib", "hid", "LibJpeg", "libtiff", "WINTAB32", "WNTAB32X", "zlib"], 
         extra_options=["SigLib.lib", "hid.lib", "LibJpeg.lib", "libtiff.lib", "WINTAB32.LIB", "WNTAB32X.LIB", "zlib.lib"] 
        ) 

setup(
     name = "Signature Capture", 
     version = "1.0", 
     ext_modules = [module] 
) 

SigLib.i

%module SigLib 
%{ 
#define SIGAPI 
#include "Include\SigLib.h" 
%} 

%include TabletParameters.i 
%include TabletInterface.i 
%include LCDInterface.i 
%include Signature.i 

Signature.i

%module Signature 
%include "Include\Signature.h" 

Я с трудом следуя примерам Swig, но из того, что я могу сказать, должно быть хорошо. SigLib.i загружается в главный заголовок (SigLib.h), который включает объявления для SIGAPI и всех основных файлов include. Он не включает Signature.h (или любой другой заголовок в других файлах интерфейса), поскольку он не соответствует всем заголовкам. Затем он загружается в дополнительные файлы интерфейса. Signature.i и все другие файлы интерфейса просто включают ссылку на заголовок для синтаксического анализа.

Я пробовал несколько разных способов, и это, кажется, было лучшим до сих пор. Тем не менее, когда я исполняю setup.py, я получаю эти ошибки:

SigLib_wrap.cpp(3417) : error C2065: 'temp' : undeclared identifier 
SigLib_wrap.cpp(3418) : error C2065: 'temp' : undeclared identifier 
SigLib_wrap.cpp(3418) : error C2059: syntax error : '*' 
SigLib_wrap.cpp(3419) : error C2513: 'TabletParameters' : no variable declared before '=' 
SigLib_wrap.cpp(3419) : error C2065: 'temp' : undeclared identifier 
SigLib_wrap.cpp(3420) : error C2065: 'temp' : undeclared identifier 
SigLib_wrap.cpp(3420) : error C2541: 'delete' : cannot delete objects that are not pointers 
SigLib_wrap.cpp(3432) : error C2275: 'TabletParameters' : illegal use of this type as an expression c:\users\kevin\downloads\sigpython\include\TabletParameters.h(18) : see declaration of 'TabletParameters' 

Глядя на сгенерированный код, большинство ошибок содержат SIGAPI, например:

SIGAPI * temp; 

SIGAPI, как представляется #define происходит в файле SigLib.h и используется в определениях классов, как:

class SIGAPI Signature 

определение SigLib.h:

#ifdef SIGLIBDLL 
#define SIGAPI __declspec(dllexport) 
#else 
#define SIGAPI 
#endif 

Я пробовал часы Googling, пытаясь найти решение этого, но мне не повезло. Я не смог найти что-либо в документации SWIG на нем, но я честно не очень уверен, что искать.

Edit:

Сделано изменение Йоргос предложенное в дополнение к загрузке в дополнительных заголовках. Кажется, он теперь генерирует весь файл обертки со всем необходимым, но получает ошибки, связанные с библиотеками.

SigLib.i

%module SigLib 
%{ 
    #include "Include\SigLib.h" 
%} 


%include <windows.i> 
%include "Include\SigLib.h" 
%include "Include\SigPoint.h" 
%include "Include\SigStroke.h" 
%include "Include\TabletParameters.h" 
%include "Include\CircularBuffer.h" 
%include "Include\SerialIoIF.h" 
%include "Include\HidIoIF.h" 
%include "Include\UsbIoIF.h" 
%include "Include\SocketIoIF.h" 
%include "Include\NewSocketIoIF.h" 
%include "Include\SimIoIF.h" 
%include "Include\ProcessSerialData.h" 
%include "Include\CaptureSig.h" 
%include "Include\TabletPoint.h" 
%include "Include\PointBuffer.h" 
%include "Include\TabletInterface.h" 
%include "Include\TabletSampleList.h" 
%include "Include\SigWindowType.h" 
%include "Include\SigFile.h" 
%include "Include\md5.h" 
%include "Include\Utilities.h" 
%include "Include\HotSpot.h" 
%include "Include\HotSpotList.h" 
%include "Include\BitmapCharacter.h" 
%include "Include\CharacterMap.h" 
%include "Include\TiffImage.h" 
%include "Include\LCDGraphicBitmap.h" 
%include "Include\LCDInterface.h" 

Я сделал это, и изменил вверх, как я загрузил все, что в настоящее время это, кажется, компиляции, но я получаю много ошибок, как эти соединительные:.

SigLib_wrap.obj : error LNK2019: unresolved external symbol "public: int __thiscall TabletInterface::PointsInPointBuffer(void)" ([email protected]@@QAEHXZ) referenced in function __wrap_TabletInterface_PointsInPointBuffer 

SigLib_wrap.obj : error LNK2019: unresolved external symbol "public: void __thiscall TabletInterface::InitProcessInputData(void)" ([email protected]@@QAEXXZ) referenced in function __wrap_TabletInterface_InitProcessInputData 

SigLib_wrap.obj : error LNK2019: unresolved external symbol "public: void __thiscall TabletInterface::CloseProcessInputData(void)" ([email protected]@@QAEXXZ) referenced in function __wrap_TabletInterface_CloseProcessInputData 

Мне нужно связать с SigLib.lib и несколькими другими файлами lib, но я не уверен, как это сделать из файла setup.py, который у меня есть, и если это будет работать даже на Python.

ответ

0

Из пункта 3.4 документации SWIG:

Общей проблемой при использовании SWIG на Windows, являются соглашения по вызову Microsoft функция , которые не входят в стандарт C++. SWIG-анализы ISO C/C++ поэтому не может иметь дело с собственными соглашениями, такими как __declspec (dllimport), __stdcall и т. Д. Однако для работы с этими соглашениями существует файл интерфейса Windows, windows.i. Файл также содержит typemaps для обработки, обычно используемые для Windows конкретных типов, таких как __int64, BOOL, DWORD и т.д. Включите его, как вы любой другой интерфейс файл, например:

%include <windows.i> 

__declspec(dllexport) ULONG __stdcall foo(DWORD, __int32); 

Добавление %include <windows.i> перед любым объявления с конкретными окнами, вероятно, помогут решить вашу проблему.

+0

Спасибо, что заставило меня двигаться в лучшем направлении. Теперь, когда он пытается скомпилировать модули Python, я получаю кучу ошибок связывания. Мне нужно связать несколько файлов .Lib, но я не могу найти окончательный ответ, если это возможно ... – kjlaw89