* Pytanie zmieniony (patrz poniżej) *zmienna globalna ma wiele kopii w systemie Windows i Linux na pojedynczym gdy skompilowany zarówno Exec i wspólne libaray
Mam plik cpp, który definiuje zmienną statyczną np globalnego
Ten plik cpp jest kompilowany do pliku wykonywalnego i biblioteki współużytkowanej. Plik wykonywalny może załadować bibliotekę współdzieloną w czasie wykonywania.
Jeśli jestem na Linuksie, wydaje się, że są dwie kopie tej zmiennej. Zakładam, że jeden pochodzi z pliku wykonywalnego, a drugi z biblioteki współdzielonej. Inne platformy (HP, Windows) wydają się mieć tylko jedną kopię.
Co kontroluje to zachowanie w systemie Linux i czy mogę to zmienić? Na przykład czy istnieje flaga kompilatora lub linkera, która wymusi wersję tej zmiennej z biblioteki współdzielonej na taką samą, jak wersja pliku wykonywalnego?
* Przegląd pytanie *
Dzięki za odpowiedzi tak daleko. Po ponownym zbadaniu problemu nie jest to problem opisany powyżej. Statyczna zmienna globalna powyżej rzeczywiście ma wiele kopii w systemie Windows, więc nie ma różnicy od tego, co widzę w systemie Linux.
Jednak, Mam inną zmienną globalną (nie statyczną tym razem), która jest zadeklarowana w pliku cpp i jako plik zewnętrzny w pliku nagłówkowym.
W systemie Windows ta zmienna ma wiele kopii, jedną w pliku wykonywalnym i jedną w każdej załadowanej bibliotece dll, a na Linuksie ma tylko jedną. Więc teraz pytanie dotyczy tej różnicy. Jak mogę sprawić, by Linux miał wiele kopii?
(Logika mojego programu oznaczało, że wartość zmiennej statycznej globalnej była zależna od wartości zmiennej non-statycznej globalnej i zacząłem zarzucając niewłaściwą zmienną jako problem)
Działanie systemu Windows zostało podane niepoprawnie. Zobacz poprawione pytanie o rzeczywistą różnicę między Windows i Linux. – Reuben
Zobacz moją zaktualizowaną odpowiedź. Ponadto przeczytanie artykułu, do którego się przyłączyłem, wyjaśni, dlaczego Linux jest w stanie to osiągnąć i dlaczego jest trudne i najwyraźniej niemożliwe w systemie Windows. –
Odpowiedź znalazła się w sekcji 2.2 dokumentu związanego z linkami. Z powodu starszej wersji kompilatora, do której byłem ograniczony i mogłem zmienić źródło, w którym zadeklarowano zmienną, skończyłem używając map eksportu (sekcja 2.2.5) – Reuben