2010-03-18 4 views
27

Ich versuche, die LizardTech GeoExpress DSDK in meine eigene Anwendung zu verknüpfen. Ich benutze gcc, damit wir für Plattformen kompilieren können. Auf Linux und Mac funktioniert das problemlos: Sie stellen eine statische Bibliothek (libltidsdk.a) und Header zur Verfügung und alles, was wir tun müssen, ist sie zu verwenden.Verknüpfung mit MSVC DLL von MinGW

Kompilieren für Windows ist nicht so einfach. Sie haben die Bibliothek mit Microsoft Visual Studio erstellt, und wir verwenden MinGW. Ich habe die MinGW-FAQ gelesen und stoße auf die folgenden Probleme. Die Bibliothek ist alles C++, also meine erste Frage: Ist das überhaupt möglich?

Durch einfaches Binden gegen die DLL erhalten Sie "undefined reference" -Fehler für alle C++ - Aufrufe (Konstruktoren, Destruktoren, Methoden usw.).

Basierend auf dem MinGW Wiki: http://www.mingw.org/wiki/MSVC%5Fand%5FMinGW%5FDLLs Ich soll das Dienstprogramm verwenden reimp kann nutzbar eine LIB in etwas zu konvertieren. Ich habe alle .lib-Dateien ausprobiert, die von LizardTech bereitgestellt werden, und alle geben "ungültige oder beschädigte Importbibliothek" an. Ich habe sowohl Version 0.4 und 0.3 des Reim-Utility ausprobiert.

Mit der zweiten im Wiki beschriebenen Methode habe ich pexport und dlltool über die DLL laufen lassen, um ein .a-Archiv zu erhalten, aber das erzeugt die gleichen undefinierten Referenzen.

BTW: Ich habe die Diskussion unten gelesen. Es ist unklar, ob dies möglich ist, und angesichts der MinGW-Wiki-Seite scheint dies machbar zu sein. Wenn es unmöglich ist, ist das alles, was ich wissen muss. Wenn es möglich ist, würde ich gerne wissen, wie ich das erreichen kann.

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

Dank!

Antwort

22

Sie können dies nicht tun. Sie haben C++ - Klassen aus ihrer DLL und nicht aus C-Funktionen exportiert. Der Unterschied ist, dass C++ - Funktionen immer mit Namen in einer verfälschten Form exportiert werden, die für eine bestimmte Version des Compilers spezifisch ist.

Ihre DLL kann von MSVC nur in dieser Form verwendet werden, und wird wahrscheinlich nicht einmal zwischen verschiedenen Versionen von msvc arbeiten, da Microsoft ihr Mangeln Schema zuvor geändert haben.

Wenn Sie irgendeine Hebelwirkung haben, müssen Sie sie dazu bringen, ihre bösen Wege zu ändern. Andernfalls müssen Sie MSVC verwenden, um eine Shim-DLL zu schreiben, die alle Klassen importiert und sie über c-Funktionen, die Schnittstellen zurückgeben, erneut exportiert.

+1

Danke, das ist genau die Bestätigung, die ich gesucht habe. Sie haben eine c-Schnittstelle, und ich benutze das, aber es ist viel weniger leistungsfähig als das, was in C++ verfügbar ist. Ich dränge sie auch, um für MinGW freizugeben. – IndigoFire

+5

Ich bevorzuge Mingw Releases von, nun, alles, wie es die Bereitstellung wirklich einfach macht, wenn die C-Laufzeit-Abhängigkeit ist die universell verfügbare msvcrt.dll, anstatt die Visual Studio-Version Laufzeiten msvcr70.dll, msvcr71.dll, msvcr80. dll, msvcr90.dll und jetzt msvcr100.dll. –

3

Ich bin fast sicher, dass Sie nicht C++ - Bibliotheken über Compiler wie diese verknüpfen können. Ich habe es versucht, wirklich schwer, aber es war lange her und ich erinnere mich nicht an die Details. Ich denke für C-Bibliotheken ist möglich, mit vielen Hacks.

0

Um eine DLL in Windows zu verwenden, verknüpfen Sie eine Importbibliothek (nicht die DLL selbst). Importbibliotheken haben normalerweise die Erweiterung .lib (genau wie statische Bibliotheken). Wenn Sie das Windows SDK herunterladen, erhalten Sie Importbibliotheken für alle System-DLLs.

Aus Ihrer Frage klingt es, als hätten Sie die .dll mit der .lib verwechselt. Sind Sie sicher, dass Reiimp keine DLL als Eingabe verwendet und eine .LIB-Importbibliothek erstellt, die mit MinGW kompatibel ist?

Ich habe gerade mit MinGW auf Wikipedia nachgeschlagen. Laut diesem Artikel enthält MinGW vertreibbare Importbibliotheken.

+1

Basierend auf dem MinGW-Wiki nimmt Reim eine Import-Bibliothek. Das Ausführen gegen die DLL funktioniert auch nicht, obwohl ich es versucht habe. – IndigoFire

Verwandte Themen