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?

È stato utile?

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

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