¿Cómo puedo crear este proyecto simple de C ++ / SWIG / C # en Visual Studio 2010?

Necesito ayuda para configurar un proyecto simple C ++ / C # SWIG. Estoy teniendo dificultades para armar un proyecto de C ++ que use los enlaces SWIG. Estoy usando Visual Studio 2010 y la versión más reciente de SWIG.

Mi código es simplemente:

cpp_file.h:

#pragma once class cpp_file { public: cpp_file(void); ~cpp_file(void); int times2(int arg); }; 

cpp_file.cpp

 #include "cpp_file.h" cpp_file::cpp_file(void) { } cpp_file::~cpp_file(void) { } int cpp_file::times2(int arg) { return arg * 2; } 

Y mi archivo de interfaz SWIG es:

cpp_file.i

 /* cpp_file.i */ %module cpp_file %{ /* Put header files here or function declarations like below */ extern int times2(int arg); %} extern int times2(int arg); 

Puedo comstackr bien este proyecto. Luego ejecuto el comando SWIG para generar el contenedor:

 swig -csharp "C:/pathToFile/cpp_file.i" 

No sé qué hacer en este punto. No puedo encontrar ningún tutorial o documentación que explique qué hacer en Visual Studio 2010.

Cuando agrego el archivo * cpp_file_wrap.c * que SWIG genera a mi proyecto de Visual Studio 2010 e bash construir el proyecto, obtengo dos errores de vinculador.

  1. error LNK1120: 1 externos no resueltos
  2. error LNK2001: símbolo externo no resuelto _times2

El primer mensaje de error apunta a mi archivo dll. El segundo error apunta a algún archivo de objeto (* .obj). El símbolo que menciona el mensaje de error “_times2” no se encuentra en mi proyecto.

¿Cómo puedo seguir adelante con mi proyecto simple? ¿Hay algún tutorial o documentación que explique este proceso paso a paso? No puedo encontrar nada que implique C ++ con SWIG, C #, Visual Studio 2010 y .Net v4.0.

Instrucciones paso a paso para comstackr completamente en el IDE VS2010:

  1. Crea una solución con dos proyectos:
    • Aplicación de consola C #
    • C ++ Win32 Console Application (Nombre = cpp, DLL, proyecto vacío). Si elige un nombre diferente, no use el nombre de una clase en su proyecto y actualice el nombre del %module archivo .i para que coincida.
  2. Cree una carpeta en el proyecto C # llamado Generado .
  3. Agregue su archivo .cpp, .h y .i a la DLL con las modificaciones a continuación.
    • Tenga en cuenta que toda la clase tiene que ser exportada. Reemplace con el nombre del proyecto. Habrá una definición de preprocesador _EXPORTS ya definida para su proyecto de DLL (vea Proyecto, Propiedades, C ++, Preprocesador).
    • El nombre del módulo no puede coincidir con un nombre de clase en el módulo.
    • %include ayuda a SWIG a entender ciertos “Window- __declspec ” como __declspec .

cpp_file.h

 #pragma once #ifdef _EXPORTS #define _API __declspec(dllexport) #else #define _API __declspec(dllimport) #endif class _API cpp_file { public: cpp_file(void); ~cpp_file(void); int times2(int arg); }; 

cpp_file.i

 %module cpp %{ #include "cpp_file.h" %} %include  %include "cpp_file.h" 
  1. Seleccione cpp_file.i , Propiedades, General, Tipo de elemento como herramienta de comstackción personalizada .
  2. Seleccione Aplicar para crear el grupo de propiedades Herramienta de comstackción personalizada.
  3. En Custom Build Tool, General, línea de comando ingrese:
    swig -csharp -c ++ -outdir GeneratedFolderPath cpp_file.i
  4. En Salidas, ingrese cpp_file_wrap.cxx y haga clic en Aceptar para cerrar el cuadro de diálogo.
  5. Haga clic derecho en cpp_file.i y compile. Esto debería crear cuatro archivos: tres en la carpeta C # Generated y uno en el proyecto C ++.
  6. Cree un filtro de archivos generados en el proyecto de C ++ y agregue cpp_file_wrap.cxx a él.
  7. Agregue los tres archivos generados a la carpeta generada del proyecto C #.
  8. Haga clic derecho en el proyecto C # y agregue el proyecto C ++ como una dependencia.
  9. En la pestaña Propiedades, Crear del proyecto C #, cambie la Ruta de salida de bin\Debug a ..\Debug o cualquiera que sea la ruta relativa al directorio de salida del Proyecto C ++. El .exe y .dll deben estar en el mismo directorio.
  10. En la página Main del proyecto C #, agregue las líneas:
    var cpp = new cpp_file();
    Console.WriteLine(cpp.times2(5));
  11. Construye la solución.
  12. Ejecutar el proyecto C #.

¡Buena suerte! Déjame saber si lo haces funcionar. Puedo ampliar cualquier cosa sin aclarar.

Solo he usado SWIG una pequeña cantidad, pero parece que está intentando exportar una función llamada times() en su archivo .i que no existe. Tiene un cpp_file::times() pero no se exporta. cpp_file definir la función times() o exportar toda la clase cpp_file a través de SWIG.

Pasaría algún tiempo leyendo la documentación oficial de SWIG , particularmente la sección de SWIG y C ++ . También hay esta pregunta sobre SO que tiene alguna información relacionada con SWIG y VS2010.

    Intereting Posts