Frage

Ich habe eine C-Wrapper für meine C ++ Framework. Da diese auf Mac und Windows laufen sollte ich bin mit 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')

Einfache Versionen von warplib.cpp und warplib.h wie folgt aussehen:

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);
}

Kann mir jemand sagen, was daran falsch ist? Ich habe versucht, fast alle Kombinationen möglich, von ‚extern‚C‘‘, aber es wirft mich immer so etwas wie „Fehler C2732: Verknüpfungsvorschrift im Widerspruch zu früheren Spezifikation für‚...‘“.

Wenn ich ‚extern‚C‘‘ überspringe es funktioniert, aber ich sehe keine LIB-Datei, und ich bin ziemlich sicher, ich brauche das, um wirklich die Bibliothek zu benutzen.

War es hilfreich?

Lösung

Sie sollten nur müssen extern "C" auf die Erklärung. Jeder einschließlich dann, dass die Header gegen sie verknüpfen erwarten, dass die C-Verknüpfung Standard, anstatt der C ++ eingerichtet Form. Die warplib.cpp Quelldatei, und nachfolgende Objektdatei wird die Funktion foo aussetzen richtig, wenn warplib.h enthalten ist.

Wenn MSVC verwendet, gibt es eine Fülle von halb nützlicher Skripte, und „Build-Umgebung“ Konsole Kürzel, mit vielen dev bezogenen Umgebungsvariablen und Pfaden zur Verfügung gestellt. Ich empfehle, ein geeignetes Skript Ortung auszuführen, diese Variablen in Ihre Umgebung einfügen, oder die Entwickler-Konsole ausgeführt wird.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top