Domanda

Ho un'applicazione che sta utilizzando una libreria statica che ho fatto. Un file cpp nella biblioteca dispone di una dichiarazione di variabile statica, le cui ctor chiama una funzione su un Singleton che fa qualcosa- esempio aggiunge una stringa.

Ora, quando io uso quella libreria dall'applicazione, il mio Singleton non sembra contenere tracce di stringa che avrebbe dovuto essere aggiunti.

Sono sicuramente manca qualcosa, ma non so cosa ..

È stato utile?

Soluzione

Se si dispone di un oggetto in una libreria statica che non è ESPLICITAMENTE utilizzato nell'applicazione. Poi il linker non tirerà quell'oggetto dalla lib nell'applicazione.

C'è una grande differenza tra le librerie statiche e dinamiche.

Libreria dinamica:
In fase di compilazione tempo nulla è tirato dalla libreria dinamica. codice aggiuntivo viene aggiunto per caricare e risolvere i simboli in fase di esecuzione in modo esplicito. In fase di esecuzione l'intera libreria viene caricata e quindi oggetto inizializzatori sono chiamati (sebbene quando è dettaglio attuazione).

Le librerie statiche sono gestite in modo molto diverso:
Quando si collega contro una libreria statica si tira tutti gli elementi che non sono definiti in applicazione che si definiscono nella libreria nell'applicazione. Questo si ripete finché non ci sono più dipendenze che la biblioteca possa risolvere. L'effetto collaterale di questo è che oggetti / funzioni non esplicitamente utilizzate non sono tirati forma biblioteca (variabili globali così che non sono direttamente accessibili non sarà tirato).

Altri suggerimenti

Il mio ricordo di questo è un po 'confuso, ma si potrebbe essere di essere colpiti con un problema di ordine di inizializzazione. Non ci sono garanzie in cui ordinano inizializzatori variabile statica in file diversi ottenere chiamato, quindi se il vostro Singleton non è ancora inizializzato quando viene inizializzato la variabile statica nella biblioteca, che potrebbe produrre l'effetto che stai vedendo.

Il modo in cui ho ottenuto intorno a questi problemi è quello di avere una sorta di una funzione init esplicito che fa questa roba e che io chiamo all'inizio del main o qualcosa del genere. Si potrebbe essere in grado di giocherellare con l'ordine in cui si dà il file oggetto e gli argomenti di libreria al compilatore (o linker, in realtà) perché è lavorato anche per me, ma che la soluzione è un po 'fragile, perché dipende non solo con il linker specifica, ma probabilmente anche la versione specifica.

refactoring le classi che fanno di inizializzazione statico in modo che non dipendono da altri tali classi. Cioè, rendere l'inizializzazione di ogni classe indipendente e autosufficiente.

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