Domanda

Ho un C-Wrapper per il mio Framework C ++. Dal momento che questo dovrebbe funzionare su Mac e Windows sto 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')

Le versioni semplici di warplib.cpp e warplib.h si presentano così:

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

Qualcuno può dirmi cosa c'è di sbagliato in questo? Ho provato quasi tutte le combinazioni possibili di "extern" C " ma mi lancia sempre qualcosa come "errore C2732: la specifica del collegamento contraddice la precedente specifica per" ... "".

Se salto "extern" C " " funziona ma non vedo alcun file .lib e sono abbastanza sicuro di averne bisogno per usare davvero la libreria.

È stato utile?

Soluzione

Dovresti avere solo extern " C " sulla dichiarazione. Chiunque includa quell'intestazione si aspetterà di collegarsi contro di esso usando lo standard di collegamento C, piuttosto che la forma decorata C ++. Il file sorgente warplib.cpp e il successivo file oggetto esporranno correttamente la funzione foo se warplib.h è incluso.

Quando si utilizza MSVC, ci sono molti script semi-utili e " build environment " scorciatoie da console fornite, con molte variabili e percorsi di ambiente relativi allo sviluppo forniti. Ti consiglio di individuare uno script adatto da eseguire per inserire queste variabili nel tuo ambiente o eseguire la console di sviluppo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top