2009-08-07 2 views
14

Dire che ho una lib di C++ statica, static.lib e voglio chiamare alcune funzioni da una lib condivisa in C++, ad esempio shared.lib. È possibile?Un collegamento a una libreria statica C++ alla libreria condivisa?

Supponiamo ora di avere un'altra lib condivisa, ad esempio shared2.lib che si collega a static.lib ma non si collega a shared.lib. In questo caso, il linker collega automaticamente shared2.lib a shared.lib?

Sto usando Microsoft Visual Studio 2003.

risposta

22

Le librerie statiche non sono collegate. Sono solo una raccolta di file oggetto (* .obj o * .o) archiviati insieme in un file di libreria (un po 'come un file tar/zip) per rendere più facile per il linker trovare i simboli di cui ha bisogno.

Una lib fisica può chiamare funzioni non definite (ma dichiarate solo in un file di intestazione), in quanto è solo compilata. Quindi, quando si collega un exe o una DLL che utilizza la lib statica, sarà necessario collegarsi a un'altra libreria che fornisce la chiamata dalla lib statica ma non definita in essa.

Se si desidera che il linker colleghi automaticamente altre librerie, il suggerimento di Stephen funzionerà e verrà utilizzato da librerie molto affidabili come boost e stlport. Per fare ciò metti il ​​pragma nel file di intestazione principale per la libreria statica. Dovresti includere la libreria statica e i suoi dipendenti.

Tuttavia, IMO questa funzione è in realtà destinata ai writer di librerie, dove la libreria si trova nel percorso della libreria di sistema in modo che il linker possa trovarla facilmente. Inoltre, nel caso di boost e stlport, utilizzano questa funzionalità per supportare più versioni delle stesse librerie con opzioni definite con #define s, in cui diverse opzioni richiedono il collegamento di diverse versioni della libreria. Ciò significa che gli utenti hanno meno probabilità di configurare l'incremento in un modo e il collegamento con una libreria configurata con un altro.

La mia preferenza per il codice dell'applicazione è di collegare esplicitamente le parti richieste.

6

Il linker non porterà automaticamente nelle altre biblioteche, ma è possibile utilizzare #pragma comment (lib, "static.lib") per semplificare il processo di collegamento dei file aggiuntivi aggiungendo il pragma ai file di intestazione.

0

dire che ho un lib statica C++, static.lib e voglio chiamare alcune funzioni da un lib condivisa C++, dicono shared.lib. È possibile?

Sì, ad esempio quando chiamate le funzioni di Windows dall'interno della libica statica, normalmente provengono da una libreria dinamica, quindi non dovrebbero esserci differenze.

Supponiamo ora che ho un altro condiviso lib, dico shared2.lib che collega al static.lib ma non creare un collegamento a shared.lib. Il linker collega automaticamente shared2.lib a shared.lib in questo caso?

Avere dipendenze come questo potrebbe causare problemi in seguito, vorrei suggerire che si invece caricare dinamicamente le librerie utilizzando LoadLibrary(), in questo modo non c'è bisogno di tenere traccia di tali dipendenze durante la compilazione/collega.

+0

Sono d'accordo che si dovrebbe fare attenzione con le dipendenze della libreria, ma penso che LoadLibrary sia eccessivo in questo caso.L'ho solo richiesto per le architetture dei tipi di plugin. – iain