Come evitare che il linker di ottimizzare via codice di avvio?
-
18-09-2019 - |
Domanda
Ho il seguente problema: La mia (C ++ -) del progetto è costituito da diversi sottoprogetti. In ogni, ho diversi file con il codice che voglio eseguire all'avvio. La mia soluzione finora è quello di utilizzare le variabili statiche che richiedono il rispettivo codice di inizializzazione in questo modo:
// Foo.cpp
static TFooRegistry sFooRegistry; // does stuff in constructor.
Quando si costruisce il mio progetto utilizzando DLL per ogni sottoprogetto, tutto funziona bene e il codice viene eseguito come previsto. Quando si collegano i sottoprogetti statico, tuttavia, il linker determina che Foo.o non contiene codice mai fatto riferimento dall'esterno e ottimizza via. Naturalmente potrei aggiungere un riferimento a sFooRegistry da qualche altra parte, ma questo è noioso e soggetto a errori.
Cosa (conforme standard) modi di risolvere questo ci sono?
OK, cosa posso fare su Mac / gcc e vincere / Visual Studio?
Soluzione
Non ci sono modi Conformant standard di forzare oggetti nelle biblioteche da inizializzare - bisogna usare trucchi a seconda della particolare piattaforma (s). La differenza tra una DLL e ed una libreria statica (su Windows, almeno) è che la primo ha start-up e il codice di arresto che viene eseguito dal sistema operativo, mentre il secondo è solo una concatenazione di file oggetto.
Inoltre, il linker non sta ottimizzando via la vostra start up del codice - non è semplicemente collegando esso, perché a quanto pare non viene mai usato. Collegatori sono piuttosto stupide bestie - se si vuole scoprire come fanno quello che fanno, dare un'occhiata il libro dei linker e Caricatori .
Altri suggerimenti
Alcuni trucco, ma esaminarlo. Per il sistema Win (ma non linux) usa dllexport esplicita - in questo caso linker doen't sa se questo simbolo utilizzato da un'applicazione esterna o no
.