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 !
Commentaires récents