Domanda

Ho bisogno di verificare qualcosa per cui ho dei dubbi. Se una libreria condivisa (dll) è scritto in C, con lo standard C99 e compilato sotto un compilatore. Say MinGW. Poi nella mia esperienza è compatibile a livello binario e quindi utilizzabile da qualsiasi altro compilatore. Say MS Visual Studio. Lo dico nella mia esperienza perché ho provato con successo più di una volta. Ma ho bisogno di verificare se questa è una regola.

E in aggiunta vorrei chiedere se è davvero così, allora perché le biblioteche scritto completamente in C, come per esempio OpenCV non forniscono binari compilati per ogni sistema operativo diverso? So che la ragione ovvia sarebbe quella di impostare tutti i parametri in fase di compilazione, ma a parte questo non c'è alcun diritto?

EDIT: Io sono l'aggiunta di una domanda supplementare che io vedo come una logica estensione a quello originale. Non è questo come si potrebbe andare a creare una libreria a sorgente chiuso? Dal momento che la possibilità di dare origine va fuori dalla finestra lì, dando binari è l'unica scelta. E in quel caso fornire i binari per più architetture possibili è il risultato desiderato, con C che è una scelta ovvia per avere la migliore portabilità tra sistemi e compilatori. Giusto?

È stato utile?

Soluzione

Nel caso specifico dei compilatori C (MSVC e GCC / MinGW) nel mondo di Windows, lei ha ragione nel presupposto della compatibilità binaria. Si può collegare una DLL un'interfaccia C compilato da GCC a un programma in Visual Studio. Questo è il modo in cui i progetti C99 come ffmpeg consentono agli sviluppatori di applicazioni di scrittura traino con Visual Studio. Basta per creare la libreria di importazione con TROVATO LIB.exe nel toolchain Microsoft dalla DLL. O viceversa, utilizzando PExports di mingw.org o strumento gendef meglio, di mingw-W64, si può creare un lib GCC per l'importazione di un prodotto MSVC DLL.

Questo pratico pause di interoperabilità verso il basso quando si entra nel mondo di interfaccia C ++, in cui l'ABI di MSVC e GCC è diverso e incompatibile. Si può lavorare, non può, non ci sono garanzie sono fatti e nessuno sforzo è (al momento) viene fatto a cambiare questo. Inoltre, informazioni di debug è ovviamente diversa, fino a quando qualcuno scrive un generatore di informazioni di debug / scrittore in GCC che è compatibile al debugger di MSVC (insieme al supporto gdb ovviamente).

Non credo C99 cambia specificamente nulla a dichiarazioni di funzione o le argomentazioni modo in cui vengono gestite in definizioni di simboli, quindi non ci dovrebbero essere problemi neanche qui.

Si noti che, come ha detto Vijay, c'è ancora la differenza architettura, in modo da una libreria x 86 non può essere utilizzato quando si collegano a una libreria AMD64.


Per rispondere alla tua anche ricevere altre informazioni su binari closed source e distribuire una versione per tutti i compilatori disponibili / architetture.

Questo è esattamente il modo in cui si creare un binario closed source. In aggiunta alla libreria di importazione, è anche molto importante per nascondere le esportazioni dalla DLL, rendendo la DLL in sé inutile per il collegamento (se non si vuole il codice client di utilizzare funzioni private nella libreria, si veda ad esempio l'uscita di dumpbin /exports su una DLL MSOffice, un sacco di roba nascosta lì). È possibile ottenere la stessa cosa con GCC (credo, mai usato o provato) usando le cose come __attribute(hidden) ecc ...

Alcuni punti compilatore specifici:

  1. MSVC è dotato di quattro (beh, in realtà solo tre rimanendo in versioni più recenti) diverse librerie di runtime attraverso / MT, / MD, e / LD. In cima a questo, si dovrà fornire una build per ogni versione di Visual Studio (inclusi i Service Pack) per garantire la compatibilità. Ma questo è chiuso binaria fonte e Windows per te ...

  2. GCC non ha questo problema; MinGW collega sempre di MSVCRT.dll fornito da Windows (a partire da Windows 98), equivalente con / MD (e forse anche una biblioteca di debug equivalente / MDD). Ma io ci sono due versioni di MinGW (mingw.org e mingw-W64) che non garantiscono la compatibilità binaria. Il secondo è più completo in quanto fornisce le opzioni a 64 bit e 32-bit, e fornisce un colpo di testa serie più completa / libreria (tra cui una parte sostanziale di DirectX e DDK).

Altri suggerimenti

La regola generale è che se la vostra combinazione OS / CPU ha uno standard ABI, e se questo ABI è abbastanza potente per la propria lingua, la maggior parte dei compilatori seguiranno che ABI e di conseguenza saranno compatibili a livello binario, che consente di librerie a collegamento (condiviso o statico) compilato con diversi compilatori di programmi compilati con altri compilatori più che bene.

Il problema è che la maggior parte ABI sono abbastanza deboli - sono progettati intorno a linguaggi di basso livello come C e FORTRAN e risalgono ai giorni prima di linguaggi orientati agli oggetti come C ++. Così essi tendono a sostenere la mancanza per cose come l'overloading di funzioni, gli operatori definiti dall'utente, le eccezioni, Case costruttrici mondiali e distruttori, funzioni virtuali, eredità, e tale che sono necessari da C ++.

Questa mancanza è stato riconosciuto quando C ++ è stato progettato ed è per questo C ++ ha extern "C" - che fa sì che il compilatore limitarsi allo standard ABI per determinate funzioni, mentre disabilitando tutte le C in più ++ caratteristiche che l'ABI generalmente non supportano.

Una libreria condivisa o DLL compilata per una particolare architettura può essere collegato ad applicazioni compilati da altri compilatori che colpiscono la stessa architettura. (Per architettura, intendo un processore combinazione / OS). Ma non è pratico per uno sviluppatore biblioteca per compilare contro tutti i possibili architetture. Inoltre, quando una libreria è distribuita in formato sorgente, gli utenti possono costruire i binari ottimizzati per le loro specifiche esigenze.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top