2

Je travaille sur un projet qui est lié à une bibliothèque statique tierce (appelée ici EXTERNALLIB). Dans Visual Studio 2005, j'étais capable de créer un lien vers EXTERNALLIB et de créer un exécutable utilisable. Maintenant, nous utilisons Visual Studio 2008 et je reçois l'erreur suivante:Erreur lors de la liaison avec une bibliothèque statique tierce construite avec la version précédente de Visual Studio

fatal error C1047: The object or library file EXTERNALLIB was created with an older compiler than other objects; rebuild old objects and libraries. 

est-il un moyen pour moi de dire au compilateur de lier correctement EXTERNALLIB? Je crois que le problème peut être lié à des conventions d'appel spécifiques (__stdcall, __cdecl, __clrcall, __thiscall). Puis-je indiquer dans le nouveau programme la convention d'appel correcte pour l'ancienne bibliothèque? Y a-t-il des commentaires spécifiques que je peux donner à notre fournisseur (comme l'utilisation d'APIENTRY dans les fichiers d'en-tête) de telle sorte que ce problème ne se produira pas lors des mises à jour futures du compilateur?

Le code est écrit en C++. Je n'ai pas accès au code pour EXTERNALLIB et donc je suis incapable de le reconstruire moi-même.

Répondre

5

Votre problème est susceptible de résulter de "le code est écrit en C++". L'ABI pour la liaison C++ est essentiellement complètement non spécifié par n'importe quel standard, et est notoirement changeable du compilateur au compilateur. Je soupçonne que VS essaie de vous dire que l'ABI a encore changé, et que par conséquent, il ne peut pas se lier directement à la bibliothèque.

Ce problème est souvent exacerbé en voulant implémenter des objets C++ dans une DLL, mais heureusement, vous n'avez pas ce problème ici.

Une approche d'une solution qui devrait fonctionner est d'habiller l'API publiée de EXTERNALLIB avec un adaptateur C-callable, et de lier tout cela dans une DLL. Construire la peau avec l'ancienne version VS (au pire, l'édition gratuite devrait toujours être trouvée). Assurez-vous que seules les fonctions extern "C" sont exposées. Assurez-vous en particulier qu'aucun objet global n'est exposé à partir de la DLL (bien qu'ils puissent avoir besoin d'exister dans votre skin).

La meilleure réponse est de retourner au fournisseur de EXTERNALLIB et de signaler poliment l'échec de lier avec le VS actuel comme un bug et demander une version reconstruite.

Questions connexes