Pregunta

Tengo un C-Wrapper para mi Framework C ++. Como esto debería ejecutarse en mac y windows, estoy usando scons :

env = Environment()
env.Append(CPPPATH = ['./'])
env.Append(LIBS = 'kernel32.lib')
env.Append(LIBPATH = 'C:/Program Files/Microsoft SDKs/Windows/v6.0A/Lib')

env.SharedLibrary(target='warpLib', source='warplib.cpp')

Las versiones simples de warplib.cpp y warplib.h tienen este aspecto:

warplib.cpp

#define DllExport __declspec( dllexport )
#include "warplib.h"

extern "C" {
  DllExport int foo(int a) {
    return a;
  }
}

warplib.h

#define DllExport __declspec( dllexport )

extern "C" {
  DllExport int foo(int a);
}

¿Alguien puede decirme qué está mal con eso? Probé casi todas las combinaciones posibles de 'extern " C "'; pero siempre me arroja algo como "error C2732: la especificación de vinculación contradice la especificación anterior para '...' " ;.

Si omito 'extern " C "' funciona pero no veo ningún archivo .lib y estoy bastante seguro de que necesito eso para usar realmente la biblioteca.

¿Fue útil?

Solución

Solo debe necesitar extern " C " en la declaración. Cualquiera que incluya ese encabezado esperará vincularse usando el estándar de enlace C, en lugar de la forma decorada de C ++. El archivo fuente warplib.cpp y el archivo objeto posterior expondrán la función foo correctamente si se incluye warplib.h .

Cuando se utiliza MSVC, hay una gran cantidad de scripts semi-útiles, y " entorno de compilación " accesos directos de consola proporcionados, con muchas variables de entorno relacionadas con dev y rutas proporcionadas. Recomiendo ubicar un script adecuado para ejecutar para insertar estas variables en su entorno, o ejecutar la consola dev.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top