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