2011-05-11 11 views
5

Hola a todos, Estoy tratando de SWIGAR un proyecto de archivos múltiples que hice en VS2010 (C++) a Python. Logré vincular el archivo Python26.lib y hacer que SWIG genere un archivo .cpp contenedor para mi archivo .cpp principal. Establecí mi código para construir un .dll con la extensión .pyd.Cómo SWIGAR en VS2010?

Este es el archivo .i tengo actualmente:

%module HiveGPS 

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


%include ou_thread.h 
%include HiveGPS.h 

Y he mangaed para obtener un archivo .py y .pyc. Ahora, según tengo entendido, para ejecutar mi archivo .py, necesito vincularlo a mi archivo .pyd, pero cuando trato de usar VS2010 para compilar mi proyecto con la configuración que mencioné anteriormente, se queja de una clase Thread I 'm usando:

1>------ Build started: Project: HiveGPS, Configuration: Release Win32 ------ 
1>Build started 5/11/2011 1:41:30 PM. 
1>InitializeBuildStatus: 
1> Touching "Release\HiveGPS.unsuccessfulbuild". 
1>ClCompile: 
1> HiveGPS_wrap.cpp 
1>c:\users\*\desktop\hivegps\hivegps\ou_thread.h(57): error C2146: syntax error : missing ';' before identifier 'm_strName' 
1>c:\users\*\desktop\hivegps\hivegps\ou_thread.h(57): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int 
1>c:\users\*\desktop\hivegps\hivegps\ou_thread.h(57): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int 
1>c:\users\*\desktop\hivegps\hivegps\ou_thread.h(64): error C2146: syntax error : missing ';' before identifier 'getName' 
1>c:\users\*\desktop\hivegps\hivegps\ou_thread.h(64): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int 
1>c:\users\*\desktop\hivegps\hivegps\ou_thread.h(64): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int 
1>c:\users\*\desktop\hivegps\hivegps\ou_thread.h(64): warning C4183: 'getName': missing return type; assumed to be a member function returning 'int' 
1>c:\users\*\desktop\hivegps\hivegps\ou_thread.h(98): error C2146: syntax error : missing ';' before identifier 'm_strName' 
1>c:\users\*\desktop\hivegps\hivegps\ou_thread.h(98): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int 
1>c:\users\*\desktop\hivegps\hivegps\ou_thread.h(98): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int 
1>c:\users\*\desktop\hivegps\hivegps\ou_thread.h(104): error C2146: syntax error : missing ';' before identifier 'getName' 
1>c:\users\*\desktop\hivegps\hivegps\ou_thread.h(104): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int 
1>c:\users\*\desktop\hivegps\hivegps\ou_thread.h(104): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int 
1>c:\users\*\desktop\hivegps\hivegps\ou_thread.h(104): warning C4183: 'getName': missing return type; assumed to be a member function returning 'int' 
1>c:\users\*\desktop\hivegps\hivegps\ou_thread.h(115): error C2146: syntax error : missing ';' before identifier 'msg' 
1>c:\users\*\desktop\hivegps\hivegps\ou_thread.h(115): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int 
1>c:\users\*\desktop\hivegps\hivegps\ou_thread.h(115): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int 
1>c:\users\*\desktop\hivegps\hivegps\ou_thread.h(118): error C2146: syntax error : missing ';' before identifier 'getMessage' 
1>c:\users\*\desktop\hivegps\hivegps\ou_thread.h(118): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int 
1>c:\users\*\desktop\hivegps\hivegps\ou_thread.h(118): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int 
1>c:\users\*\desktop\hivegps\hivegps\ou_thread.h(118): warning C4183: 'getMessage': missing return type; assumed to be a member function returning 'int' 
1>c:\users\*\desktop\hivegps\hivegps\ou_thread.h(51): error C2011: 'openutils::Thread' : 'class' type redefinition 
1>   c:\users\*\desktop\hivegps\hivegps\ou_thread.h(51) : see declaration of 'openutils::Thread' 
1>c:\users\*\desktop\hivegps\hivegps\ou_thread.h(93): error C2011: 'openutils::Mutex' : 'class' type redefinition 
1>   c:\users\*\desktop\hivegps\hivegps\ou_thread.h(93) : see declaration of 'openutils::Mutex' 
1>c:\users\*\desktop\hivegps\hivegps\ou_thread.h(113): error C2011: 'openutils::ThreadException' : 'class' type redefinition 
1>   c:\users\*\desktop\hivegps\hivegps\ou_thread.h(113) : see declaration of 'openutils::ThreadException' 
1>c:\users\*\desktop\hivegps\hivegps\HiveGPS.h(29): error C2504: 'openutils::Thread' : base class undefined 
1>c:\users\*\desktop\hivegps\hivegps\HiveGPS.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\*\desktop\hivegps\hivegps\ou_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 ========== 

Todos estos errores (menos el último) están básicamente diciendo que la clase string se implementa alguna manera, es contradictoria con la definición de la clase string de Python? El último error es quejarse de la clase Thread, ¿podría ser ese el mismo problema?

Todo eso dicho: ¿Puede alguien decirme qué estoy haciendo mal, o mejor aún, señalarme un tutorial de cómo hacer esto para VS2010 (el sitio de SWIG es para 2008).

Y si eso no se puede hacer, ¿puedo vincular el archivo .py que he generado con el archivo .dll de alguna manera?

Perdón por la larga explicación, pero estoy un poco perdido en esta, así que decidí explicarlo todo.

+1

Podría ser cualquier cosa. SWIG es bastante compatible, pero necesita ayuda con algunos constructos. Sin ver los archivos de encabezado o cómo está compilando el contenedor de SWIG generado, es difícil determinar qué es lo que está mal. –

+0

Si la cadena utilizada es std :: string, consulte http://www.swig.org/Doc1.3/Library.html – Torleif

Respuesta

11

Ok, estoy usando VS2010 trago y sin problemas ...

En su caso, se parece más a tiene problemas con la vinculación. Más allá del control de las bibliotecas, no se olvide de consultar las bibliotecas de 32-64 bits que está enlazando. Intente vincular todo como un objetivo x86 como a prueba de fallas. Y no use AnyCpu.


Cómo utilizar el TRAGO bajo VS2010.

Definamos que desea obtener mylib.py, por lo que creó algunos archivos de interfaz SWIG con mylib.i como archivo "principal". Supongo que ya tiene una solución con proyecto con sus clases de C++ allí.

(1) Primero cree el proyecto C++ para la interfaz SWIG. Utilice el proyecto de biblioteca de Visual C++ -> Class que debería crear un código auxiliar de DLL de C++. Puse todos los archivos .i allí. Y configure Visual Studio para resaltar .i as .h - es útil.

(1,1) Añadir archivo mylib_wrap.cxx al proyecto (crear el archivo vacío mientras trago no ha generado todavía uno)

(2)
a) Pulse el botón derecho sobre el mibiblioteca. yo, elegir propiedades.
b) establece ItemType como "Herramienta de compilación personalizada".
En la ventana de paso de generación personalizada:
c) campo Línea de comandos debe ser algo como:

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:\swig\swig.exe -c++ -python %(FullPath) 

cambio C: \ trago \ trago.exe en el camino hacia el TRAGO

d) En el campo Salidas:

$(InputName)_wrap.cxx 

Custom build window

(3) ir a este propiedades del proyecto:

a) C++ pestaña - >Directorios de inclusión adicionales
add $ (PYTHON_INCLUDE); ...

c) Enlazador ->la salida a archivo Necesaria-Path-Usted
\ _mylib.pyd

d) Enlazador -> Habilitar incremental Enlace de
conjunto como No (/ INCREMENTAL: NO)

e) Engarce ->entrada ->Dependencias adicionales
add $ (PYTHON_LIB); ...

f) C/C++ ->encabezados precompilados: Desconectar encabezados precompilados, ajuste ** No utilizar precompilado Encabezados * y eliminar archivos stdafx después de

g) General tab. Sólo tienes que comprobar que éstos se establecen:
tipo Configuración = Biblioteca dinámico (DLL)
conjunto de caracteres = Uso de caracteres Unicode soporte de conjuntos
Common Language Runtime Soporte = No se Common Language Runtime

Compila.

P.S. Y no olvide establecer% PYTHON_INCLUDE% y% PYTHON_LIB% variables en su sistema también.

+1

si el archivo de salida .cxx debe incluirse en el proyecto. – innochenti

+0

Sí. Actualicé la publicación. – MajesticRa

0

Parece que falta #include en ou_thread.h.

Adicionalmente, en el " 'clase' tipo de redefinición" puede indicar que usted no tiene algo así como

#ifndef __ou_thread_h__ 
#define __ou_thread_h__ 

// your stuff, classes, etc. 

#endif 

en su ou_thread.h

Es un adivinando ...