web-dev-qa-db-fra.com

Lien vers MSVC DLL de MinGW

J'essaie de lier le DSDK LizardTech GeoExpress à ma propre application. J'utilise gcc afin que nous puissions compiler sur des plates-formes. Sous Linux et Mac, cela fonctionne facilement: ils fournissent une bibliothèque statique (libltidsdk.a) et des en-têtes et tout ce que nous avons à faire est de les utiliser.

Compiler pour Windows n'est pas si facile. Ils ont construit la bibliothèque à l'aide de Microsoft Visual Studio et nous utilisons MinGW. J'ai lu la FAQ de MinGW et je rencontre les problèmes ci-dessous. La bibliothèque est entièrement en C++, alors ma première question est la suivante: est-ce possible?

La simple liaison avec la dll fournie fournit des erreurs "référence indéfinie" pour tous les appels C++ (constructeurs, constructeurs, méthodes, etc.).

Basé sur le wiki de MinGW: http://www.mingw.org/wiki/MSVC%5Fand%5FMinGW%5FDLLs Je devrais pouvoir utiliser l'utilitaire reimp pour convertir une lib dans quelque chose utilisable. J'ai essayé tous les fichiers .lib fournis par LizardTech et ils donnent tous une "bibliothèque d'importation invalide ou corrompue". J'ai essayé les versions 0.4 et 0.3 de l'utilitaire reimp.

En utilisant la deuxième méthode décrite dans le wiki, j’ai exécuté pexport et dlltool sur la dll pour obtenir une archive .a, mais cela produit les mêmes références non définies.

BTW: J'ai lu la discussion ci-dessous. Cela laissait une certaine ambiguïté quant à savoir si cela était possible et, étant donné la page Wiki de MinGW, il semble que cela devrait être faisable. Si c'est impossible, c'est tout ce que j'ai besoin de savoir. Si cela peut être fait, j'aimerais savoir comment je peux y arriver.

Comment créer un lien avec les librairies générées par VS2008 à partir de g ++

Merci!

27
IndigoFire

Tu ne peux pas faire ça. Ils ont exporté des classes C++ à partir de leur DLL, plutôt que des fonctions C. La différence est que les fonctions c ++ sont toujours exportées avec des noms sous une forme mutilée spécifique à une version particulière du compilateur.

Leur dll est utilisable par msvc uniquement sous cette forme, et ne fonctionnera probablement même pas entre différentes versions de msvc, car Microsoft a déjà modifié son schéma de gestion.

Si vous avez un effet de levier, vous devez les amener à changer leurs méthodes diaboliques. Sinon, vous devrez utiliser MSVC pour écrire une dll, qui importera toutes les classes, puis réexportez-les via des fonctions c qui renvoient des interfaces.

23
Chris Becke

Je suis  presque  certain que vous ne pouvez pas lier des bibliothèques C++ à travers des compilateurs comme ça. J'ai essayé très durement, mais c'était il y a longtemps et je ne me souviens pas des détails. Je pense que pour les bibliothèques C est possible, avec beaucoup de hacks. 

3
Chris H

Pour utiliser une DLL dans Windows, vous créez un lien vers une bibliothèque d'importation (et non la DLL elle-même). Les bibliothèques d'importation ont généralement l'extension .lib (tout comme les bibliothèques statiques). Si vous téléchargez le Kit de développement logiciel (SDK) Windows, vous obtiendrez des bibliothèques d'importation pour toutes les DLL système.

D'après votre question, il semblerait que vous ayez mélangé le fichier .dll avec le fichier .lib. Etes-vous sûr que reimp ne prend pas un DLL en entrée et crée une bibliothèque d'importation .LIB compatible avec MinGW?

Je viens de regarder avec MinGW est sur Wikipedia. Selon cet article, MinGW est livré avec des bibliothèques d'importation redistribuables.

0
Adrian McCarthy

Je pensais juste ajouter mes deux sous ici.

Lorsque vous voulez lier une dll dans MSVC, vous liez une .lib qui contient des stubs de fonction qui appellent à leur tour la fonction correspondante dans le fichier .dll (une indication supplémentaire avec "__imp__" ajoutée au nom mutilé). GCC ne le fait pas, car en théorie, vous pouvez facilement créer un lien direct vers la dll si les fonctions sont exposées par la table d'exportation. Vous pouvez dire à GCC dans MinGW de regarder directement dans la DLL en utilisant -l. Il est vrai que le schéma de nommage C++ varie selon les différentes versions de MSVC, mais pas entre toutes. Elles sont cohérentes dans la plupart des versions et des extensions sont ajoutées à mesure que de nouvelles fonctionnalités sont mises en œuvre. 

Cependant, MinGW utilise le schéma de gestion de noms GCC, qui inclut la recherche de symboles externes, afin de ne pas reconnaître les noms MSVC mutilés. L'éditeur de liens pourrait facilement résoudre ce problème en remélangeant les symboles externes pour faire correspondre MSVC, puis en vérifiant à nouveau s'il existe une correspondance. Peut-être que cela sera implémenté un jour. Je l'ai résolu de la même manière dans mon propre langage de programmation, mais cela inclut bien sûr mon propre éditeur de liens.

Il est tout à fait possible de fournir un fichier .lib à GCC dans MinGW, il suffit de le spécifier sur la ligne de commande de la même manière que vous spécifiez les fichiers source; gcc -o test.cpp main.cpp external.lib … Ceci fournira à l'éditeur de liens les noms mutilés qu'il devrait rechercher. MinGW est également capable de gérer les noms mutilés de MSVC, il a même son propre mutileur/démangleur MSVC dans libmangle.

0
Christopher Bekesi