2011-01-22 5 views
22

Sto usando una libreria C++ che può essere costruita come libreria condivisa o statica. Questa libreria utilizza una tecnica factory, in cui gli oggetti statici si registrano quando viene avviato il programma e vengono creati gli oggetti statici.Come forzare gcc a collegare oggetti C++ statici senza riferimento da una libreria

Questo funziona bene fino a quando viene utilizzata la libreria condivisa. Quando viene utilizzata la versione statica, nessuno degli oggetti statici viene incluso nel programma finale (perché non viene fatto riferimento direttamente) e quindi la loro funzionalità non è disponibile.

C'è un modo per forzare gcc a includere tutti gli oggetti statici da una libreria durante il collegamento?

La libreria è Open Source e potrei modificarla, se questo aiuta.

risposta

22

È possibile utilizzare -Wl,--whole-archive -lyourlib, consultare la manpage per ld per ulteriori informazioni.

Qualsiasi libreria statica menzionata dopo -Wl, - l'intero archivio sulla riga di comando viene completamente incluso, è possibile disattivarlo di nuovo anche se è necessario, come ad es. -Wl,--whole-archive -lyourlib -Wl,--no-whole-archive -lotherlib

+5

-Wl, - l'intero archivio causa l'inclusione di molti simboli già inclusi in altre librerie o alcuni che non possono essere risolti. Esiste un modo più fine per includere la statica? –

+0

Questo non ha senso Gene: è come caricare una libreria condivisa: si ottiene l'intera libreria e nient'altro. Devo dire che ho una nozione sbagliata di trovare riferimenti esterni, quindi è necessario ottenere l'ordine delle cose nel modo giusto. – Yttrill

+7

L'interruzione del comportamento con '-Wl, - no-whole-archive' non è in realtà opzionale, anche se non ci sono più librerie da includere. GCC aggiungerà tutte le librerie di sistema standard alla fine del tuo comando, quindi se lasci '--whole-archive' ne saranno tutti influenzati e causerà il problema del simbolo duplicato @GeneVincent commentato su –

1

Una specie di trucco mi ha aiutato. Devo ancora includere l'intestazione anche se.

// in the header with your class 
struct RegistrationHelper { 
    RegistrationHelper(); 
}; 

static RegistrationHelper Helper; 

// in your cpp where you register your class 
RegistrationHelper::RegistrationHelper() {} 
+0

Ma questo presuppone la collaborazione dell'autore '.cpp', che ora deve essere a conoscenza di ogni singolo oggetto helper di registrazione nella libreria statica. – einpoklum

Problemi correlati