Question

J'ai un C-Wrapper pour mon framework C ++. Puisque cela devrait fonctionner sur mac et windows, j'utilise 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')

Les versions simples de warplib.cpp et warplib.h ressemblent à ceci:

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

Quelqu'un peut-il me dire ce qui ne va pas avec ça? J'ai essayé presque toutes les combinaisons possibles de 'extern' ';' '' mais cela me renvoie toujours quelque chose comme "l'erreur C2732: la spécification de liaison est en contradiction avec la spécification antérieure de '...'".

Si je saute le mot "extern" "C" ça marche mais je ne vois pas de fichier .lib et je suis presque sûr d’avoir besoin de ça pour utiliser vraiment la bibliothèque.

Était-ce utile?

La solution

Vous ne devriez avoir besoin que de extern " "C" sur la déclaration. Toute personne qui inclut alors cet en-tête s’attendra à établir un lien avec lui en utilisant la norme de liaison C plutôt que la forme décorée C ++. Le fichier source warplib.cpp et le fichier objet suivant exposeront correctement la fonction foo si warplib.h est inclus.

Lors de l'utilisation de MSVC, il existe une pléthore de scripts semi-utiles et "environnement de construction". Raccourcis de la console fournis, avec beaucoup de variables d’environnement et de chemins liés au développement fournis. Je recommande de localiser un script approprié à exécuter pour insérer ces variables dans votre environnement ou d'exécuter la console de développement.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top