2010-03-18 16 views
27

Sto provando a collegare LizardTech GeoExpress DSDK alla mia applicazione. Io uso gcc in modo che possiamo compilare per piattaforme. Su Linux e Mac questo funziona facilmente: forniscono una libreria statica (libltidsdk.a) e le intestazioni e tutto ciò che dobbiamo fare è usarle.Collegamento a MSVC DLL da MinGW

Compilare per Windows non è così facile. Hanno costruito la libreria utilizzando Microsoft Visual Studio e usiamo MinGW. Ho letto le Domande frequenti su MinGW e sto riscontrando i seguenti problemi. La libreria è tutto in C++, quindi la mia prima domanda: è possibile?

Il solo collegamento alla DLL fornita restituisce errori di "riferimento non definito" per tutte le chiamate C++ (costruttori, descrittori, metodi, ecc.).

Sulla base del MinGW Wiki: http://www.mingw.org/wiki/MSVC%5Fand%5FMinGW%5FDLLs dovrei essere in grado di utilizzare l'utilità reimp per convertire un lib in qualcosa di utilizzabile. Ho provato tutti i file .lib forniti da LizardTech e tutti loro danno "libreria di importazione non valida o corrotta". Ho provato entrambe le versioni 0.4 e 0.3 del programma di utilità reimp.

Utilizzando il secondo metodo descritto nel wiki, ho eseguito pexport e dlltool sulla DLL per ottenere un archivio .a, ma questo produce gli stessi riferimenti non definiti.

BTW: Ho letto la discussione qui sotto. Ha lasciato qualche ambiguità sul fatto che sia possibile, e data la pagina Wiki MinGW sembra che questo dovrebbe essere fattibile. Se è impossibile, è tutto ciò che ho bisogno di sapere. Se può essere fatto, mi piacerebbe sapere come posso farlo accadere.

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

Grazie!

risposta

22

Non è possibile farlo. Hanno esportato le classi C++ dalla loro DLL, piuttosto che dalle funzioni C. La differenza è che le funzioni C++ vengono sempre esportate con nomi in una forma storpiata che è specifica per una particolare versione del compilatore.

La loro DLL è utilizzabile da msvc solo in quella forma e probabilmente non funzionerà nemmeno tra diverse versioni di msvc, poiché Microsoft ha già modificato il proprio schema di mangling.

Se si dispone di una leva, è necessario farli cambiare i loro modi cattivi. Altrimenti sarà necessario utilizzare MSVC per scrivere una DLL di shim, che importerà tutte le classi e le ri-esporterà tramite le funzioni c che restituiscono le interfacce.

+1

Grazie, questa è esattamente la conferma che stavo cercando. Hanno un'interfaccia c, e sto cercando di usarlo, ma è molto meno potente di quello che è disponibile in C++. Li sto anche spingendo a rilasciare per MinGW. – IndigoFire

+5

Preferisco le versioni mingw di, beh, tutto, in quanto rende la distribuzione davvero semplice quando la dipendenza c-runtime è msvcrt.dll universalmente disponibile, piuttosto che i runtime specifici della versione di Visual Studio msvcr70.dll, msvcr71.dll, msvcr80. dll, msvcr90.dll e ora msvcr100.dll. –

3

Sono quasi sicuro che non è possibile collegare librerie C++ a compilatori simili. Ci ho provato, davvero difficile, ma è stato tanto tempo fa e non ricordo i dettagli. Penso che per le librerie C sia possibile, con molti hack.

0

Per utilizzare una DLL in Windows, ci si collega a una libreria di importazione (non alla DLL stessa). Le librerie di importazione hanno in genere l'estensione .lib (proprio come le librerie statiche). Se scarichi Windows SDK, otterrai le librerie di importazione per tutte le DLL di sistema.

Dalla tua domanda, sembra che tu abbia potuto confondere il file .dll con .lib. Sei sicuro che reimp non prenda una DLL come input e crei una libreria di importazione .LIB compatibile con MinGW?

Ho appena cercato con MinGW su Wikipedia. Secondo questo articolo, MinGW viene fornito con librerie di importazione ridistribuibili.

+1

Sulla base del wiki MinGW, reimp accetta una libreria di importazione. Anche eseguirlo contro la DLL non funziona, anche se l'ho provato. – IndigoFire

Problemi correlati