2012-07-03 21 views
5

Estoy en proceso de aprender a usar SWIG en Windows.Creando una DLL desde un archivo cpp envuelto con SWIG

La siguiente es mi código C++:

/* File : example.cxx */ 

#include "example.h" 
#define M_PI 3.14159265358979323846 

/* Move the shape to a new location */ 
void Shape::move(double dx, double dy) { 
    x += dx; 
    y += dy; 
} 

int Shape::nshapes = 0; 

double Circle::area(void) { 
    return M_PI*radius*radius; 
} 

double Circle::perimeter(void) { 
    return 2*M_PI*radius; 
} 

double Square::area(void) { 
    return width*width; 
} 

double Square::perimeter(void) { 
    return 4*width; 
} 

Este es mi archivo de cabecera:

/* File : example.h */ 

    class Shape { 
    public: 
    Shape() { 
    nshapes++; 
    } 
    virtual ~Shape() { 
    nshapes--; 
}; 
    double x, y; 
    void move(double dx, double dy); 
    virtual double area(void) = 0; 
    virtual double perimeter(void) = 0; 
    static int nshapes; 
    }; 

class Circle : public Shape { 
private: 
    double radius; 
public: 
    Circle(double r) : radius(r) { }; 
    virtual double area(void); 
    virtual double perimeter(void); 
}; 

class Square : public Shape { 
private: 
    double width; 
public: 
    Square(double w) : width(w) { }; 
    virtual double area(void); 
    virtual double perimeter(void); 
}; 

Este es mi archivo de interfaz:

/* File : example.i */ 
%module example 

%{ 
#include "example.h" 
%} 

%include "example.h" 

he logrado envolver mi Código de C++ con el siguiente comando en Cygwin usando SWIG:

$swig -c++ -python -o example_wrap.cpp example.i 

Mi pregunta es, ¿cómo creo una DLL de aquí en adelante utilizando el código generado (example_wrap.cpp)? ¿Algunas ideas?

intenté crear una DLL con C++ 2010 Visual Studio, pero me sale el error de compilación:

LINK : fatal error LNK1104: cannot open file 'python27_d.lib 

Soy bastante nuevo en el uso TRAGO por lo que cualquier ayuda sería muy apreciada.

Gracias!

Respuesta

5

Si busca en el directorio libs de su instalación de Python, sospecho que encontrará python27.lib y no python27_d.lib. Creo que _d.lib es la versión de depuración de la biblioteca de Python y su instalación de Python no lo incluyó. En otra parte que he visto sugirió que la forma más simple de hacerlo es descargar las fuentes de Python y crear las versiones de depuración y depuración usted mismo, pero nunca lo he intentado. Alternativamente, puede cambiar su compilación para usar la versión de lanzamiento de .lib de Python. Debería poder depurar su propio código pero no el código de Python.

+0

Gracias a Jackson por su pronta respuesta! :) Comprobé los archivos de Python y parece que, como dijiste, hay un python27.lib pero no un python27_d.lib. Así que supongo que la próxima pregunta sería ... ¿Alguien sabe de una forma de hacer que Visual Studio C++ 2010 acepte la versión de lanzamiento de Python lib? – user1449530

+1

Si abre las propiedades del proyecto y va a Enlazador-> Entrada debería ver en las Dependencias Adicionales una referencia al Python27_d.lib. Edite esto para que sea el Python27.lib e intente volver a compilar. – Jackson

+0

¡Gracias de nuevo Jackson por su tiempo! Miré hacia atrás en Visual Studio 2010 Linker> Input pero no encontré Python27_d.lib. Al final, decidí quedarme con cygwin. ¡Gracias de todos modos! – user1449530

5

El problema parece ser que, por razones desconocidas, el archivo pyconfig.h IMPIDE el uso de un archivo .lib llamado específicamente. ¡AY! Francamente, esto me parece un error: ¡que el programador especifique qué archivo .lib usar! ¡No lo fuerces!

En el siguiente código, simplemente puede #ifdef 0 todo el asunto, o cambiar el nombre de "python27_d" a "python".

De todos modos, aquí está el código ofensiva desde pyconfig.h:

/* For an MSVC DLL, we can nominate the .lib files used by extensions 
*/ 
#ifdef MS_COREDLL 
# ifndef Py_BUILD_CORE /* not building the core - must be an ext */ 
#  if defined(_MSC_VER)   /* So MSVC users need not specify the .lib file in   their Makefile (other compilers are generally   taken care of by distutils.) */ 
#   ifdef _DEBUG 
#    pragma comment(lib,"python27_d.lib") 
#   else 
#    pragma comment(lib,"python27.lib") 
#   endif /* _DEBUG */ 
#  endif /* _MSC_VER */ 
# endif /* Py_BUILD_CORE */ 
#endif /* MS_COREDLL */ 
10

añadir MS_NO_COREDLL Definición en la configuración Propiedades-> C/C++ -> Preprocessor-> Definiciones del preprocesador; o agregue la línea #define MS_NO_COREDLL antes de incluir python.h.

#define MS_NO_COREDLL 
#include <Python.h> 
+0

Muchas gracias, realmente me ayuda a compilar el código fuente de la versión python2.5. Pero ¿puedes decirme por qué debería agregar esto? – x5lcfd

+2

Después de esto obtengo el error LNK2001: símbolo externo sin resolver _Py_RefTotal –

0

Me enteré de que addind los símbolos de Python hacen que el Proyecto lo resuelva. Hacerlo como this

También copié el python27.lib en un archivo denominado python27_d.lib

2

La construcción del proyecto en modo de lanzamiento elimina la dependencia python27_d.lib también; al menos lo hizo para mi propio proyecto.

0

Puede intentar agregar "python27_d.lib"(sin comillas) para libs ignorados:

Propiedades de configuración -> Enlazador -> Entrada -> Ignorar biblioteca específica

3

TRAGO (al menos en la versión 3.0) genera la inclusión Python.h en el envoltorio como del siguiente modo:.

#if defined(_DEBUG) && defined(SWIG_PYTHON_INTERPRETER_NO_DEBUG) 
/* Use debug wrappers with the Python release dll */ 
# undef _DEBUG 
# include <Python.h> 
# define _DEBUG 
#else 
# include <Python.h> 
#endif 

Así que al compilar una versión de depuración de la envoltura en una plataforma Windows, simplemente hay que definir la bandera SWIG_PYTHON_INTERPRETER_NO_DEBUG para evitar el problema pyconfig.h archivo mencionado en la respuesta de Ken

0

resolví el python27_d.lib falta de la siguiente manera:

  • Copia python27.lib a python27_d.lib
  • En comentario pyconfig.h cabo define Py_DEBUG
Cuestiones relacionadas