Faire discuter C# et C/C++ (et d’autres)

Posted by & filed under Dev'.

Arrrgh !

[ Guide non exhaustif réalisé lorsque j’étais encore stagiaire 😉 ]

Cette exception m’a donné un peu de fil à retordre, je vais donc partager ma solution avec vous.
Dans le cadre d’un projet C#, il arrive qu’on ait besoin d’utiliser des libraires (.DLL) non managées. Pour l’impétrant ce n’est pas forcément une balade de santé…  même en demandant à Google.

La problématique est la suivante : « J’ai trouvé un source C++ génial sur le net qui fait exactement ce que je veux, et j’aimerais l’utiliser dans mon application C#. »

Ceci dit cet article peut vous aider si vous cherchez simplement à utiliser une DLL quelconque en C# (sautez à l’étape deux).

Read more »

Attention au compilateur C-+ de Visual Studio 2008

Posted by & filed under Dev'.

Je ne suis pas un grand expert C/C++ mais j’ai eu affaire à une chose étrange aujourd’hui, qui m’aura couté (et à d’autres) de longues heures.

Erreur de l’éditeur de lien : error LNK2019: unresolved external symbol « short __cdecl ga_population_seed(struct population_t *) »

Le contexte, une solution C/C++ principalement écrite en C, dont deux des projets sont une librairies (sortie en .lib) C (GAUL : Genetic Algorithm Utility Library pour ne pas la citer).

La compilation se passe sans heurts (ceci dit, nous avons du modifier un petit peu la version soit disant Windows de GAUL pour qu’elle fonctionne sous VS2008 – soucis de #define, etc… assez triviaux dans l’ensemble). Mais le linking est une catastrophe, impossible pour VS de trouver les fonctions définies dans le header de notre librairie. Diantre !

Et bien le souci vient de la configuration du projet par défaut sous Visual Studio. En effet celui ci nous propose de choisir entre un compilateur C, et un compilateur C++, mais son choix par défaut semble être un étrange et indigeste mix des deux !

Tentative d’explication :

– Le compilateur par défaut (qui accepte de compiler sans broncher) doit déclarer nos fonctions (dans les .obj) d’une maniere differente de celle attendue par le linker ( __cdecl blah-blah-blah)

La solution :

– Forcer le compilateur a utiliser le compilateur C++ (ou C suivant votre convenance)

– Corriger les erreurs levées par le compilateur (et ca peut etre long, dans notre cas GAUL utilise moult attributions de pointeurs sans cast, déclare des fonctions s’appelant new ou delete, … – environ 300 erreurs au total chez nous).

Et voila, ça devrait linker correctement maintenant !