Liaison de librairies DLL ayant une dépendance circulaire
Prenons le cas de la librairie libprojet
qui définit l'interface IParametres
et une seconde libeurocode
. libeurocode
implémente IParametres
avec les normes EC et libprojet
est liée à libeurocode
pour l'utiliser de façon native (sans chargement dynamique).
L'astuce consiste à compiler libeurocode
en premier (choix arbitraire) mais sans demander à le lier (via l'éditeur de lien) avec la librairie libprojet
. La compilation (.dll
) va échouer mais l'édition des liens (.lib
) va réussir.
Ensuite, il reste à compiler normalement libprojet
en le liant à libeurocode
et enfin à recompiler libeurocode
en le liant cette fois avec libprojet
. Ainsi les 2 libraires sont bien générées.
Afin d'avoir à éviter de modifier le projet à chaque compilation l'une librairie, il est conseillé de créer 3 projets pour générer les 2 librairies. Le premier pour libeurocode
sans la liaison avec libprojet
, le deuxième pour libprojet
avec la liaison avec libeurocode
et enfin le troisième qui sera parfaitement identique au premier sauf que la liaison avec libprojet
sera définie.
error LNK2038: mismatch detected for 'ITERATOR_DEBUG_LEVEL': value 'X' doesn't match value 'Y' in AAA.lib(BBB.cpp.obj)
Se produit quand on essaie de lier un programme compilé avec l'option Debug et une Dll avec l'option Release (ou inversement).