C-DLL de fuente de C ++
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.
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.