#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
Это предположение…