Question

J'essaie d'exécuter mon application C # / C ++ sous Linux après l'avoir développée sous Windows.

Une petite partie de celle-ci, FooLib, est écrite en C ++, qui est invoquée par C # pour des performances optimales. FooLib n'utilise aucun appel système, seulement les fonctionnalités C ++ standard. Il exporte une fonction unique, déclarée comme:

extern "C" __declspec(dllexport) void Foo(float*, int, float*);

Il est compilé avec Visual C ++. J'ai essayé d'exécuter l'application sous mono avec FooLib.dll compilé avec Windows, mais le chargement de la DLL (DllImport) a échoué avec:

Unhandled Exception: System.DllNotFoundException:Foo(single[2],int,single[])

Alors, que dois-je faire?

  • Changer la déclaration d'exportation d'une manière ou d'une autre?
  • Compilez l’objet dans une bibliothèque .so avec gcc sous Linux, puis chargez-le?
  • Compilez-le dans un fichier .dll avec gcc sous Linux, puis chargez-le?
  • Autre chose?
Était-ce utile?

La solution

Vous devez recompiler votre bibliothèque sous Linux, vous obtiendrez un fichier foolib.so. Ensuite, vous devez créer une carte Dll ( vérifier ce lien ) afin que vous n'ayez pas à le faire. spécifiez un nom de bibliothèque * .so pour Linux dans votre code C # et un * .dll distinct pour Windows: c’est un moyen de mapper facilement le nom de la bibliothèque en fonction du système d’exploitation.

Autres conseils

SWIG est un très bon outil d’automatisation des liaisons natives. http://www.swig.org/

D'accord avec le premier commentaire. Votre code .NET devrait fonctionner correctement sous Linux sans aucune recompilation, mais votre appel natif doit être compilé en mode natif.

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