È ansible eseguire il collegamento a una combinazione di file .dll + .lib di Windows utilizzando gcc / g ++ in Cygwin?

So come collegarmi alle librerie in contesti Unix-ish: Se sto lavorando con file .a o .so , specifico la directory di ricerca root con -L/my/path/to/lib/ e per libMylib I add -lMyLib .

Ma cosa succede se ho

  • a .dll (ad es. nella directory Windows\System32 )?
  • a .dll (in Windows\System32 ) e a .lib (altrove)?

Queste DLL sono di qualche altra parte; Non ho accesso alle loro fonti – ma ho accesso ai corrispondenti file di inclusione, contro cui riesco a compilare.

Se è ansible eseguire il collegamento a un file .lib in Cygwin o MinGW, è ansible (indirettamente) eseguire il collegamento a una DLL.

Nel mondo MSVC, non è insolito creare una libreria di importazione insieme a una DLL. È una libreria statica ( .lib ) che carica la DLL e avvolge l’interfaccia della DLL. Basta chiamare le funzioni wrapper nella libreria di importazione (statica) e lasciare che la libreria di importazione esegua tutte le cose relative alla DLL.

  • Per l’API di Windows, ci sono librerie di importazione in WindowsSDK.
  • Per le proprie DLL MSVC, MSVC può generare automaticamente le librerie di importazione quando si crea la DLL.
  • Per una DLL di terze parti, è ansible creare una libreria di wrapper statica basata sui file di intestazione corrispondenti.

È ansible il collegamento con il file .lib in Cygwin o MinGW. Esempio:

 g++ -o myprg myprg.o -lShlwapi 

Questo link contro Shlwapi.lib. (La libreria deve essere nella directory locale o nel percorso della libreria del linker.)

Il collegamento con le librerie di importazione delle DLL funziona allo stesso modo.

Nota 1: tenere a mente le diverse ABI e il nome mangeling. Tuttavia, la chiamata di semplici funzioni C nei file DLL o LIB funzionerà nella maggior parte dei casi.

Nota 2: tenere presente che g ++ richiede che le librerie siano specificate nell’ordine corretto.