Creando un DLL desde un archivo cpp envuelto con SWIG

Estoy en el proceso de aprender a usar SWIG en Windows.

El 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 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 desde este punto en adelante usando el código generado (example_wrap.cpp)? ¿Algunas ideas?

Intenté crear una DLL con Visual Studio C ++ 2010 pero me aparece el error de comstackción:

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

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

¡Gracias!

Si busca en el directorio libs de su instalación de Python, sospecho que encontrará un python27.lib y no un 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 la incluyó. En otras partes, he visto que sugería que la forma más sencilla de solucionar esto es descargar las fonts de Python y comstackr las versiones de lanzamiento y depuración, pero nunca lo he intentado. Alternativamente, cambie la comstackción para usar la versión de lanzamiento de Python .lib. Debería poder depurar su propio código pero no el código de Python.

agregue la definición de MS_NO_COREDLL en Propiedades de configuración-> C / C ++ -> Preprocesador-> Definiciones de preprocesador; o agregue la línea #define MS_NO_COREDLL antes de incluir python.h.

 #define MS_NO_COREDLL #include  

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

En el código a continuación, puede simplemente #ifdef 0 todo, o cambiar el nombre de “python27_d” a “python”.

De todos modos, aquí está el código ofensivo de 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 */ 

SWIG (al menos en v3.0) genera la inclusión de python.h en la envoltura de la siguiente manera:

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

Por lo tanto, al comstackr una versión de depuración del contenedor en una plataforma Windows, simplemente debemos definir el indicador SWIG_PYTHON_INTERPRETER_NO_DEBUG para evitar el pyconfig.h archivo pyconfig.h mencionado en la respuesta de Ken.

La creación del proyecto en el modo Release también elimina la dependencia de python27_d.lib; Al menos lo hizo para mi propio proyecto.

Descubrí que al agregar los símbolos de Python, el Proyecto lo resuelve. Hazlo así

También copié python27.lib a un archivo llamado python27_d.lib

Puedes intentar agregar “python27_d.lib” (sin comillas) a las libretas ignoradas:

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

Resolví el archivo python27_d.lib que faltaba haciendo lo siguiente:

  • Copie python27.lib en python27_d.lib
  • En pyconfig.h comentar fuera define Py_DEBUG