Как выполнить SWIG в VS2010?

#c #python #visual-studio-2010 #swig

#c #python #visual-studio-2010 #swig

Вопрос:

Всем привет, я пытаюсь перенести мультифайловый проект, который я создал в VS2010 (c ), на python. Мне удалось связать файл Python26.lib, и SWIG сгенерировал файл-оболочку .cpp для моего основного файла .cpp. Я настроил свой код на сборку .dll с расширением .pyd.

Это файл .i, который у меня есть в данный момент:

 %module HiveGPS

%{
#include "ou_thread.h"
#include "HiveGPS.h"
%}


%include ou_thread.h
%include HiveGPS.h
  

И я попытался получить файлы .py и .pyc. Теперь, насколько я понимаю, для запуска моего файла .py мне нужно связать его с моим файлом .pyd, но когда я пытаюсь использовать VS2010 для сборки моего проекта с настройками, которые я перечислил выше, он жалуется на класс Thread, который я использую:

 1>------ Build started: Project: HiveGPS, Configuration: Release Win32 ------
1>Build started 5/11/2011 1:41:30 PM.
1>InitializeBuildStatus:
1>  Touching "ReleaseHiveGPS.unsuccessfulbuild".
1>ClCompile:
1>  HiveGPS_wrap.cpp
1>c:users*desktophivegpshivegpsou_thread.h(57): error C2146: syntax error : missing ';' before identifier 'm_strName'
1>c:users*desktophivegpshivegpsou_thread.h(57): error C4430: missing type specifier - int assumed. Note: C   does not support default-int
1>c:users*desktophivegpshivegpsou_thread.h(57): error C4430: missing type specifier - int assumed. Note: C   does not support default-int
1>c:users*desktophivegpshivegpsou_thread.h(64): error C2146: syntax error : missing ';' before identifier 'getName'
1>c:users*desktophivegpshivegpsou_thread.h(64): error C4430: missing type specifier - int assumed. Note: C   does not support default-int
1>c:users*desktophivegpshivegpsou_thread.h(64): error C4430: missing type specifier - int assumed. Note: C   does not support default-int
1>c:users*desktophivegpshivegpsou_thread.h(64): warning C4183: 'getName': missing return type; assumed to be a member function returning 'int'
1>c:users*desktophivegpshivegpsou_thread.h(98): error C2146: syntax error : missing ';' before identifier 'm_strName'
1>c:users*desktophivegpshivegpsou_thread.h(98): error C4430: missing type specifier - int assumed. Note: C   does not support default-int
1>c:users*desktophivegpshivegpsou_thread.h(98): error C4430: missing type specifier - int assumed. Note: C   does not support default-int
1>c:users*desktophivegpshivegpsou_thread.h(104): error C2146: syntax error : missing ';' before identifier 'getName'
1>c:users*desktophivegpshivegpsou_thread.h(104): error C4430: missing type specifier - int assumed. Note: C   does not support default-int
1>c:users*desktophivegpshivegpsou_thread.h(104): error C4430: missing type specifier - int assumed. Note: C   does not support default-int
1>c:users*desktophivegpshivegpsou_thread.h(104): warning C4183: 'getName': missing return type; assumed to be a member function returning 'int'
1>c:users*desktophivegpshivegpsou_thread.h(115): error C2146: syntax error : missing ';' before identifier 'msg'
1>c:users*desktophivegpshivegpsou_thread.h(115): error C4430: missing type specifier - int assumed. Note: C   does not support default-int
1>c:users*desktophivegpshivegpsou_thread.h(115): error C4430: missing type specifier - int assumed. Note: C   does not support default-int
1>c:users*desktophivegpshivegpsou_thread.h(118): error C2146: syntax error : missing ';' before identifier 'getMessage'
1>c:users*desktophivegpshivegpsou_thread.h(118): error C4430: missing type specifier - int assumed. Note: C   does not support default-int
1>c:users*desktophivegpshivegpsou_thread.h(118): error C4430: missing type specifier - int assumed. Note: C   does not support default-int
1>c:users*desktophivegpshivegpsou_thread.h(118): warning C4183: 'getMessage': missing return type; assumed to be a member function returning 'int'
1>c:users*desktophivegpshivegpsou_thread.h(51): error C2011: 'openutils::Thread' : 'class' type redefinition
1>          c:users*desktophivegpshivegpsou_thread.h(51) : see declaration of 'openutils::Thread'
1>c:users*desktophivegpshivegpsou_thread.h(93): error C2011: 'openutils::Mutex' : 'class' type redefinition
1>          c:users*desktophivegpshivegpsou_thread.h(93) : see declaration of 'openutils::Mutex'
1>c:users*desktophivegpshivegpsou_thread.h(113): error C2011: 'openutils::ThreadException' : 'class' type redefinition
1>          c:users*desktophivegpshivegpsou_thread.h(113) : see declaration of 'openutils::ThreadException'
1>c:users*desktophivegpshivegpsHiveGPS.h(29): error C2504: 'openutils::Thread' : base class undefined
1>c:users*desktophivegpshivegpsHiveGPS.h(53): error C2079: 'HiveGPS::readWriteMutex' uses undefined class 'openutils::Mutex'
1>HiveGPS_wrap.cpp(3086): error C2027: use of undefined type 'openutils::Thread'
1>          c:users*desktophivegpshivegpsou_thread.h(51) : see declaration of 'openutils::Thread'
1>HiveGPS_wrap.cpp(3086): fatal error C1903: unable to recover from previous error(s); stopping compilation
1>
1>Build FAILED.
1>
1>Time Elapsed 00:00:02.10
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
  

Все эти ошибки (за исключением последней) в основном говорят о том, что класс String каким-то образом реализован, противоречит ли это определению класса String в Python? Последняя ошибка связана с жалобой на класс Thread, может ли это быть той же проблемой?

Все сказанное: кто-нибудь может сказать мне, что я делаю не так, или, еще лучше, указать мне на руководство о том, как это сделать для VS2010 (сайт SWIG предназначен для 2008).

И если это невозможно сделать, могу ли я связать сгенерированный мной файл .py с .файл dll каким-то образом?

Извините за длинное объяснение, но я немного запутался в этом, поэтому решил все объяснить.

Комментарии:

1. Это может быть что угодно. SWIG поддерживает совсем немного, но нуждается в помощи с некоторыми конструкциями. Не видя заголовочных файлов или того, как вы компилируете сгенерированную оболочку SWIG, трудно определить, что не так.

2. Если используемая строка является std::string , см. swig.org/Doc1.3/Library.html

Ответ №1:

Хорошо, я использую swig и VS2010 без проблем…

В вашем случае это больше похоже на то, что у вас проблемы со связыванием. Помимо проверки библиотек, не забудьте проверить 32-64-разрядные библиотеки, на которые вы ссылаетесь. Попробуйте связать все как цель x86 как отказоустойчивую. И не используйте AnyCPU.


Как использовать SWIG в VS2010.

давайте определим, что вы хотите получить mylib.py итак, вы создали несколько файлов интерфейса SWIG с mylib.i в качестве «основного» файла. Я предполагаю, что у вас уже есть решение с project с вашими классами C там.

(1) Сначала создайте проект C для интерфейса SWIG. Используйте Visual C -> Проект библиотеки классов, который должен создать заглушку C DLL. Я поместил туда все файлы .i. И установите Visual Studio для выделения .я как .h — это удобно.

(1.1) Добавьте файл mylib_wrap.cxx в проект (создайте пустой файл, пока swig его еще не сгенерировал)

(2)
a) Нажмите правую кнопку над mylib.i, выберите свойства.
б) установите ItemType как «Пользовательский инструмент сборки».
В окне шага пользовательской сборки:
c) Поле командной строки должно быть чем-то вроде:

 echo In order to function correctly, please ensure the following environment variables are
correctly set: 
echo PYTHON_INCLUDE: %PYTHON_INCLUDE% 
echo PYTHON_LIB: %PYTHON_LIB% 
echo on 
C:swigswig.exe -c   -python %(FullPath) 
  

изменить C:swigswig.exe к вашему пути к SWIG

d) В поле Outputs:

 $(InputName)_wrap.cxx
  

Окно пользовательской сборки

(3) Перейдите в свойства этого проекта:

a) Вкладка C -> Дополнительные включаемые каталоги
добавьте $(PYTHON_INCLUDE); …

c) Компоновщик -> Выходной файл
Необходимыйпуть_mylib.pyd

d) Компоновщик -> Включить инкрементное связывание
установить как No (/INCREMENTAL: НЕТ)

e) Компоновщик -> Ввод -> Дополнительные зависимости
добавьте $(PYTHON_LIB);…

f) C / C -> Предварительно скомпилированные заголовки: отключите предварительно скомпилированные заголовки, установите ** Не использовать предварительно скомпилированные заголовки * и удалите файлы stdafx после

g) вкладка «Общие«. Просто убедитесь, что они установлены:
Тип конфигурации = Динамическая библиотека (.dll)
Набор символов = Использовать набор символов Unicode
Поддержка среды выполнения Common Language = Нет поддержки среды выполнения Common Language

Он компилируется.

P.S. И не забудьте также установить переменные %PYTHON_INCLUDE% и %PYTHON_LIB% в вашей системе.

Комментарии:

1. должен ли выходной файл .cxx быть включен в проект?

Ответ №2:

Кажется, что в ou_thread.h отсутствует какой-либо #include.

Более того, переопределение типа «‘class'» может указывать на то, что у вас нет чего-то вроде

 #ifndef __ou_thread_h__
#define __ou_thread_h__

// your stuff, classes, etc.

#endif
  

в вашем ou_thread.h

Это предположение…