2012-10-12 14 views
8

Używam GoogleTest do testowania moich projektów C++, a po stwierdzeniu, że prekompilowane biblioteki nie są już dystrybuowane w pakiecie Ubuntu, znalazłem następujące informacje na stronie projektu:Czy można bezpiecznie połączyć z biblioteką statyczną zbudowaną przy użyciu różnych flag kompilatora?

Jeśli test Google i skompilować kod testowy stosując różne flagi kompilatora , mogą zobaczyć różne definicje tego samego klasy/funkcji/zmiennej (np z powodu użycia #if w teście Google). Dlatego, aby zachować zdrowy rozsądek, zalecamy unikanie instalowania wstępnie skonfigurowanych bibliotek testów Google. Zamiast tego każdy projekt powinien sam kompilować test Google, aby mieć pewność, że te same flagi są używane zarówno dla testu Google, jak i testów.

Podejrzewam, że nie należy kompilować GoogleTest oddzielnie od testowanego projektu. Czego nie rozumiem, to to, czy to jest po prostu test GoogleTest, czy też jest to rzecz ogólna do łączenia bibliotek.

Pytanie

Czy istnieje sytuacja, w której jest niebezpieczne odwołuje się do prekompilowana zewnętrznych bibliotek, flagi kompilatora lub inny, a jeśli nie, co jest takiego specjalnego GoogleTest?

+0

Twój cytat wydaje się brakować ważnej części: 'Jeśli kompilujesz Test Google i swój kod testowy używając różnych flag kompilatora, mogą zobaczyć różne definicje tej samej klasy/funkcji/zmiennej (np. Z powodu użycia #if w teście Google).' –

+0

Zaktualizowałem cytat z bitem, który wskazujesz. –

Odpowiedz

6

Istnieje kilka flag kompilatora, w szczególności te, które działają z wyrównaniem, które mogą powodować problemy.

Od GCC i386 and x86-64 flags

-malign-double
-mno-align-double

sterowania czy GCC wyrównuje podwójne, long double i long long zmiennych na granicy dwóch słowo lub granica jednego słowa. Wyrównanie podwójnych zmiennych na granicy dwóch słów tworzy kod, który działa nieco szybciej na Pentium kosztem większej ilości pamięci.

Na x86-64, -malign-double jest domyślnie włączony.
Ostrzeżenie: jeśli używasz przełącznika -malign-double, struktury zawierające powyższe typy są ustawione inaczej niż opublikowane specyfikacje interfejsu binarnego dla 386 i nie są binarnie zgodne ze strukturami w kodzie skompilowanym bez tego przełącznika.

Na przykład użycie tej flagi w 32-bitowym systemie spowoduje, że liczba podwójna i długa będzie wyrównana do 64-bitów. Jeśli kompilujesz bibliotekę bez flagi, a następnie spróbujesz użyć biblioteki podczas używania flagi, struktury zawierające powyższe typy mogą mieć różne dopasowania i mogą nie współdziałać.

Inne (znacznie prostsze) przypadki mogą również zapewniać ten sam zestaw #defines, aby zapewnić używanie tych samych definicji funkcji/struktury/klasy (i innych takich naruszeń ODR). Na przykład użycie "--std = C++ 11" w gcc, który włącza wersje C++ 11 klas Standard Library, które w niektórych przypadkach są inne niż poprzednie wersje.

+1

's/will/may/g' - w zależności od szczęścia biblioteka może działać poprawnie. –

Powiązane problemy