* Domanda rivisto (vedi sotto) *variabile Global ha più copie su Windows e un singolo su Linux quando compilato sia in exec e condivisa libaray
Ho un file cpp che definisce una variabile globale statica per esempio
Questo file cpp viene compilato in un eseguibile e una libreria condivisa. L'eseguibile può caricare la libreria condivisa in fase di esecuzione.
Se sono su Linux, sembrano esserci due copie di questa variabile. Presumo che uno provenga dall'eseguibile e uno dalla libreria condivisa. Altre piattaforme (HP, Windows) sembrano essere solo una copia.
Cosa controlla questo comportamento su Linux e posso modificarlo? Ad esempio c'è un flag di compilatore o linker che costringerà la versione di questa variabile dalla libreria condivisa a essere uguale a quella dell'eseguibile?
* Revisione della domanda *
Grazie per le risposte finora. Nel riesaminare il problema, in realtà non è il problema indicato sopra. La variabile statica globale sopra ha effettivamente più copie su Windows, quindi nessuna differenza rispetto a quello che vedo su Linux.
Tuttavia, ho un'altra variabile globale (non statica questa volta) che è dichiarata in un file cpp e come esterna in un file di intestazione.
Su Windows questa variabile ha più copie, una nell'eseguibile e una in ogni DLL caricata, e su Linux ne ha solo una. Quindi la domanda è ora su questa differenza. Come posso fare in modo che Linux abbia più copie?
(La logica del mio programma significava il valore della variabile globale statica era dipendente del valore della variabile globale non statico e ho iniziato accusando la variabile sbagliata quale causa dei problemi)
Il comportamento di Windows è stato dichiarato in modo errato. Vedi la domanda rivista per la differenza effettiva tra Windows e Linux. – Reuben
Vedere la mia risposta aggiornata. Inoltre, leggendo l'articolo a cui mi sono collegato spiegherò perché Linux è in grado di raggiungere questo obiettivo e perché è difficile e apparentemente impossibile in Windows. –
La risposta era nella sezione 2.2 del documento collegato. A causa della versione precedente del compilatore mi sono limitato a e posso cambiare la fonte in cui è stata dichiarata la variabile, ho finito con l'utilizzo delle mappe di esportazione (sezione 2.2.5) – Reuben