Używam statycznej inicjalizacji, aby ułatwić proces rejestracji niektórych klas z fabryki w C++. Niestety, myślę, że kompilator optymalizuje "nieużywane" obiekty, które mają za zadanie wykonywać użyteczną pracę w swoich konstruktorach. Czy istnieje sposób, aby powiedzieć kompilatorowi, aby nie optymalizować zmiennej globalnej?W jaki sposób mogę zapobiec kompilacji moich "nieużywanych" zmiennych globalnych?
class SomeClass {
public:
SomeClass() {
/* do something useful */
}
};
SomeClass instance;
Mój punkt przerwania w konstruktorze SomeClass nie zostaje trafiony. W moim rzeczywistym kodzie SomeClass znajduje się w pliku nagłówkowym, a instancja jest w pliku źródłowym, mniej lub bardziej samodzielnie.
EDYCJA: Jak można się domyślić, KJAWolf, kod ten jest faktycznie skompilowany do statycznej biblioteki, a nie do pliku wykonywalnego. Jego celem jest zarejestrowanie niektórych typów dostarczanych przez statyczną bibliotekę statyczną listę typów i ich twórców, dla fabryki, która następnie będzie czytać z konstrukcji. Ponieważ te typy są dostarczane z biblioteką, dodanie tego kodu do pliku wykonywalnego jest niepożądane.
Odkryłem również, że przenoszenie kodu do innego pliku źródłowego zawierającego inny istniejący kod działa poprawnie. Wygląda na to, że przyczyną problemu jest posiadanie pliku składającego się wyłącznie z tych globalnych obiektów. To tak, jakby ta jednostka tłumaczeniowa została całkowicie zignorowana.
Czy plik źródłowy jest częścią pliku wykonywalnego, czy jest częścią biblioteki statycznej? – KJAWolf
Aha, dobra robota divining. W rzeczywistości plik źródłowy jest częścią statycznej biblioteki lib. Czy to spowoduje problem? Jestem 80% pewny, że zrobiłem dokładnie to samo wcześniej i to zadziałało. –
miałem ten sam problem: http://stackoverflow.com/questions/599035/force-visual-studio-to-link-all-symbols-in-a-lib-file – Lodle