Problem:
Konstruktor zmiennej globalnej nie jest wywoływany.
Po długich godzinach szukania co tu się w ogóle dzieje okazało się, że problem występuje tylko w niektórych plikach w projekcie i tylko w Visual Studio.

Rozwiązanie:
Problem pojawia się jeśli w statycznej libce (dołączanej później do exeka) masz zmienne globalne. Visual Studio domyślnie podczas linkowania nie bierze wszystkich rzeczy z libki - konieczne jest dodanie argumentu linkera /WHOLEARCHIVE (wielkość liter zdaje się mieć znaczenie, co na windowsie nie jest zbyt częste).
W przypadku CMake trzeba dodać:
set_property(TARGET projekt_robiący_binarkę APPEND PROPERTY LINK_OPTIONS /WHOLEARCHIVE:libka_ze_zmiennymi_globalnymi)

Uwielbiam Microsoft. Gdyby nie to, że linkowanie używając GCC zajmuje u mnie ~2 minuty to bym dalej siedział na Eclipse.
#cpp #programowanie #visualstudio
koszotorobur

@shiranai - co tam w tym C++ rzeźbisz?

shiranai

@koszotorobur A taką sobie gierkę platformową https://www.youtube.com/watch?v=_aA81Z04OTk

koszotorobur

@shiranai - no nieźle, nieźle - ma to ręce i nogi

def

Nie znam cpp, ale „konstruktor zmiennej” brzmi co najmniej dziwnie

MostlyRenegade

@def bo ten język jest w ogóle dziwny

def

Ale nawet google nie nie wie o konstruktorach zmiennych, chyba, ze autor dokonal tutaj jakiegos skrotu myslowego

shiranai

@def Tak, skrót myślowy - chodzi o konstruktor obiektu globalnego, zdefiniowanego "luzem" w pliku źródłowym.

krokietowy

Korzystasz z linkera mold? Jest czsami kilka razy szybszy niż ldd czy gnu gold

shiranai

@krokietowy Myślałem o wypróbowaniu innych linkerów, ale biorąc pod uwagę, że GDB czasem mi się wysypuje (czy debuggery debuguje się debuggerami?), to już wolę siedzieć na Visualu. Generalnie działa on całkiem sprawnie, ale widać, że robił go Microsoft - podpowiadanie składni zawsze na pierwszym miejscu daje najgorszą możliwą opcję, dokładnie tak, jak Excel.

groman43

@shiranai Szczerze, jeśli polegasz na takich zależnościach, to na Twoim miejscu zastanowiłbym się, czy to co robisz ma sens.

shiranai

@groman43 Uwierz mi, że przez chwilę nawet się nad tym zastanawiałem.

Używam w swojej grze Lua. Lua pozwala zdefiniować własne funkcje w C i używać ich z poziomu skryptu. Wcześniej każdą zdefiniowaną funkcję musiałem ręcznie dodawać do Lua. Stwierdziłem, ze to za dużo roboty i chcę się pobawić w automatyczne ich dodawanie. Odgapiłem sposób stosowany do testów w Catch2: https://github.com/catchorg/Catch2/blob/v2.x/include/internal/catch_test_registry.h#L106 . Dopiero po fakcie przypomniałem sobie, że z nim też były problemy jeśli testy definiowałem w osobnej libce.

Zaloguj się aby komentować