2010-03-18 3 views
27

J'essaie de relier le LizardTech GeoExpress DSDK dans ma propre application. J'utilise gcc pour que nous puissions compiler sur des plateformes. Sur 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.Lien vers la DLL MSVC à partir de MinGW

La compilation pour Windows n'est pas si facile. Ils ont construit la bibliothèque en utilisant Microsoft Visual Studio, et nous utilisons MinGW. J'ai lu la FAQ MinGW, et je suis confronté aux problèmes ci-dessous. La bibliothèque est tout en C++, donc ma première question: est-ce possible? Le simple fait de lier la dll comme prévu fournit des erreurs de "référence indéfinie" pour tous les appels C++ (constructeurs, destructeurs, méthodes, etc.).

Basé sur le Wiki MinGW: http://www.mingw.org/wiki/MSVC%5Fand%5FMinGW%5FDLLs je devrais être en mesure d'utiliser l'utilitaire reimp pour convertir un .lib en 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 lancé pexport et dlltool sur la DLL pour obtenir une archive .a, mais cela produit les mêmes références indéfinies.

BTW: J'ai lu la discussion ci-dessous. Il a laissé une certaine ambiguïté quant à savoir si cela est possible, et étant donné la page MinGW Wiki, 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.

How to link to VS2008 generated .libs from g++

Merci!

Répondre

22

Vous ne pouvez pas faire cela. 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 tronquée spécifique à une version particulière du compilateur. Leur dll n'est utilisable par msvc que sous cette forme, et ne fonctionnera probablement même pas entre les différentes versions de msvc, car Microsoft a déjà changé son système de mangling.

Si vous avez un effet de levier, vous devez les amener à changer leurs mauvaises manières. Sinon, vous devrez utiliser MSVC pour écrire une DLL shim, qui importera toutes les classes et les réexportera via les fonctions c qui retournent les interfaces.

+1

Merci, c'est exactement la confirmation que je cherchais. Ils ont une interface c, et je cherche à l'utiliser, mais c'est beaucoup moins puissant que ce qui est disponible en C++. Je les pousse aussi à sortir pour MinGW. – IndigoFire

+5

Je préfère les versions mingw de, eh bien, tout, car il rend le déploiement très simple lorsque la dépendance c-runtime est le msvcrt.dll universellement disponible, plutôt que les exécutions msvcr70.dll, msvcr71.dll, msvcr80 spécifiques à la version de studio visuel. dll, msvcr90.dll et maintenant msvcr100.dll. –

3

Je suis presque certain que vous ne pouvez pas lier les bibliothèques C++ à travers les compilateurs comme ça. J'ai essayé, vraiment dur, 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.

0

Pour utiliser une DLL dans Windows, vous liez une bibliothèque d'importation (pas 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 SDK Windows, vous obtiendrez des bibliothèques d'importation pour toutes les DLL système. De votre question, il semble que vous ayez mélangé le fichier .dll avec le fichier .lib. Êtes-vous sûr que reimp ne prend pas une DLL comme entrée et fait une bibliothèque d'importation .LIB compatible avec MinGW?

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

+1

Basé sur le wiki MinGW, reimp prend une bibliothèque d'importation. L'exécuter contre la DLL ne fonctionne pas non plus, bien que je l'ai essayé. – IndigoFire

Questions connexes