La liaison de MSVC DLL à partir de MinGW
J'essaie de relier le LizardTech GeoExpress DSDK dans ma propre application. J'utilise gcc afin que nous puissions établir sur les plates-formes. Sur Linux et Mac cela fonctionne facilement: ils fournissent une bibliothèque statique (libltidsdk.a
) et les en-têtes et tout ce que nous avons à faire est de les utiliser.
De compiler pour windows n'est pas si facile. Ils ont construit la bibliothèque à l'aide de Microsoft Visual Studio, et on utilise MinGW. J'ai lu le MinGW FAQ, et je suis en cours d'exécution dans les problèmes ci-dessous. La bibliothèque est tous C++, donc ma première question: est-ce même possible?
Juste un lien à l'encontre de la dll en tant que condition rendements "undefined reference" erreurs pour tous les appels C++ (constructeurs, desctructors, méthodes, etc).
Basé sur le MinGW Wiki:
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 d'utilisable. J'ai essayé toutes les .lib fichiers fournis par LizardTech, et ils donnent tous des "invalides ou corrompus bibliothèque d'importation". J'ai essayé les deux version de 0,4 et 0,3 de la reimp utilitaire.
En utilisant la deuxième méthode décrite dans le wiki, j'ai couru pexport et dlltool sur la dll pour obtenir un .une archive, mais qui produit la même undefined références.
BTW: j'ai lu la discussion ci-dessous. Il a laissé une certaine ambiguïté quant à savoir si c'est possible, et compte tenu de la MinGW page de Wiki, il semble que ce devrait être faisable. Si c'est impossible, c'est tout que j'ai besoin de savoir. Si cela peut être fait, je voudrais savoir comment je peux obtenir ce que cela arrive.
Comment faire un lien vers VS2008 généré .libs de g++
Merci!
- mingw.org/wiki/DLL peut être utile pour vous.
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez pas faire cela. Ils ont exporté des classes C++ à partir de leur dll, plutôt que de C-fonctions. La différence est, c++ des fonctions sont toujours exportés avec les noms dans un mutilé de la forme qui est spécifique à une version du compilateur.
Leur dll est utilisable par msvc seulement sous cette forme, et ne sera probablement pas le même travail entre les différentes versions de msvc, comme Microsoft ont changé leur régime de déformation avant.
Si vous avez un effet de levier, vous avez besoin de les amener à changer leurs mauvaises voies. Sinon, vous aurez besoin d'utiliser MSVC pour écrire une cale de dll, ce qui va importer toutes les classes, et de les ré-exporter via c les fonctions qui retournent des interfaces.
Je suis presque certains que vous ne pouvez pas lier des 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.
Utiliser une DLL dans Windows, vous pouvez lier à l'encontre d'une bibliothèque d'importation (pas la DLL elle-même). Bibliothèques d'importation ont généralement l'extension .lib (tout comme les bibliothèques statiques). Si vous téléchargez le SDK de Windows, vous obtiendrez des bibliothèques d'importation pour toutes les Dll système.
De votre question, il semble que vous pourriez avoir mélangé les .dll avec la .lib. Êtes-vous sûr reimp ne pas prendre une DLL en tant qu'entrée et faire un .LIB bibliothèque d'importation qui est compatible avec MinGW?
J'ai juste regardé avec MinGW est sur Wikipédia. Selon cet article, MinGW est livré avec redistribuable bibliothèques d'importation.
Juste pensé que je voudrais ajouter mon grain de sel ici.
Lorsque vous souhaitez lier à l'encontre d'une dll dans MSVC, ce que vous faites est de se lier à un .lib qui contient des stubs de fonction qui à son tour appelle la fonction correspondante dans le .dll (une indirection supplémentaire avec "__imp__" ajouté à la déformation du nom). GCC ne pas le faire, parce que, en théorie, vous pouvez facilement accéder directement à la dll si les fonctions sont exposés par la table d'exportation. Vous pouvez demander à GCC de MinGW pour regarder dans la dll directement à l'aide de -l . Il est vrai que le C++ schéma de nommage varie de quelques versions différentes de MSVC mais pas sur chacun d'eux. Ils sont cohérents dans la plupart des versions et extensions sont ajoutées de nouvelles fonctionnalités de mise en œuvre.
MinGW cependant appel à la GCC name mangling régime, qui inclut la recherche de signes extérieurs, de sorte qu'il ne reconnaît pas le MSVC les noms déformés. L'éditeur de liens pourrait facilement résoudre ce problème en remangling de signes extérieurs de match MSVC et vérifiez de nouveau si il y a un match. Peut-être que ce sera mis à jour.
J'ai résolu dans mon propre langage de programmation de manière similaire, mais qui comprend bien sûr mon propre éditeur de liens.
Il est tout à fait possible de fournir de GCC dans MinGW avec un .lib, il suffit de le spécifier sur la ligne de commande de la même manière que vous indiquez la source des fichiers; gcc-o test.cpp main.cpp externe.lib ... Cela permettra de fournir à l'éditeur de liens avec les noms déformés qu'il doit rechercher. MinGW est capable de traiter avec MSVC les noms déformés trop, il a même son propre MSVC mangler/demangler dans libmangle.