Domanda

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

Ora pensare che ho un altro lib condivisa, dico shared2.lib che collega al static.lib ma non creare un collegamento a shared.lib. Ha il linker collega automaticamente shared2.lib a shared.lib in questo caso?

Sto usando Microsoft Visual Studio 2003.

È stato utile?

Soluzione

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

Un lib statica può richiamare le funzioni che non sono definiti (ma sono dichiarati solo in un file di intestazione), in quanto è compilato solo. Poi, quando si collega un exe o dll che utilizza il lib statica si dovrà collegare con un'altra libreria che fornisce la chiamata dal lib statica ma non definito in esso.

Se si vuole il linker collegherà automaticamente altre biblioteche suggerimento di Stefano lavoreranno e viene utilizzato dalle biblioteche molto affidabili come boost e STLport. Per fare questo ha messo il pragma nel file di intestazione principale per la libreria statica. È necessario includere la libreria statica e dei suoi dipendenti.

Tuttavia IMO questa funzione è davvero significava per gli scrittori biblioteca, dove la biblioteca si trova nel percorso della libreria di sistema in modo che il linker sarà facile trovarlo. Anche nel caso di boost e STLport usano questa funzione per supportare più versioni delle stesse librerie con le opzioni definite con #defines dove diverse opzioni richiedono diverse versioni della libreria da collegare. Ciò significa che gli utenti sono meno propensi a configurare spinta in un modo e il collegamento con una libreria configurata un altro.

La mia preferenza per il codice dell'applicazione è quello di collegare in modo esplicito le parti necessarie.

Altri suggerimenti

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.

  

dire che ho un lib statica C ++,   static.lib e voglio chiamare un po '   funzioni da un C ++ lib condiviso, dicono   shared.lib. E 'possibile?

Sì, per esempio quando si chiamano le funzioni di Windows all'interno del tuo lib statica sono normalmente da qualche libreria dinamica quindi non ci dovrebbe essere alcuna differenza.

  

Ora presumo che ho condiviso un'altra   lib, dicono shared2.lib che collega a   static.lib ma non si collega a   shared.lib. Fa il linker   collegarsi automaticamente al shared2.lib   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.

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