Opcje zależne od implementacji
Istnieje duża liczba opcji dla narzędzi kompilacyjnych GNU pozwalających na subtelne kontrolowanie wszystkich aspektów procesu budowania projektu. Szczególną uwagę należy jednak zwrócić na wszelkie ustawienia, które włączają, wyłączają czy w jakikolwiek sposób zmieniają sposób generacji kodu wynikowego ze źródeł zgodnych ze standardami języków C i C++. To niewidoczne dla użytkownika działanie może spowodować wiele problemów z migracją kodu skompilowanego przy innych założeniach o zachowaniu kompilatora oraz przy konsolidacji z bibliotekami, które zostały zbudowane z innymi, niekompatybilnymi ustawieniami kompilacji.
Zagadnienia, w których mogą się pojawić takie problemy i które należy dokładnie sprawdzić to:
- Rozmiary standardowych typów danych (integer, float, poszerzone znaki),
- Domyślne ustawienia znaku liczby (signed/unsigned) dla typu char,
- Rozmiary typów wyliczeniowych,
- Pakowanie struktur,
- Rozkład pól bitowych.
W celu określenia konfliktów w zachowaniach domyślnych, należy się odwołać do dokumentacji obu kompilatorów, a także przejrzeć pliki sterujące budowaniem przenoszonego projektu, aby sprawdzić czy nie były w nich używane żadne specjalne ustawienia zmieniające domyślne zachowanie narzędzi.
Parametry wywołania narzędzi IAR EmbeddedWorkbench wraz z dokładnymi odpowiednikami lub opcjami podobnymi dla GCC zostały zestawione w poniższej tabeli. Tam, gdzie przy opcji dla GCC znajduje się gwiazdka (*), dostępna jest więcej niż jedna możliwość, co pozwala na precyzyjniejszą kontrolę.
Tab. 18. Parametry wywołania
Parametr IAR | Parametr GNU | Rozdział dokumentacji GCC | Komentarz |
-aapcs | -mabi=aapcs | 3.17.2 | Określa konwencję wywoływania procedur. |
–aeabi | -mabi=aapcs | 3.17.2 | Włącza generowanie kodu zgodnego z AEABI. |
–align_sp_on_irq | brak | Rozmiar słowa stosu jest ustawiany domyślnie. | |
–arm | (zachowanie domyślne) | brak | Ustawia domyślny tryb wykonywania funkcji jako ARM. |
–char_is_signed | -fsigned-char | 3.17.2 | Traktuje char jako zmienne ze znakiem (signed). |
–cpu |
-mcpu -mtune -march |
3.17.2 | Określa typ procesora. |
–cpu_mode |
–mthumb –mthumb-interwork |
3.17.2 | Ustawia domyślny tryb wykonywania funkcji. |
-D | -D | 3.11 | |
–debug | -g* | 3.9 | Generuje informacje dla debugera. |
–dependencies | -M* | 3.11 | Wypisuje zależności między plikami. |
–diag_error | brak | 3.7 | Wyświetlanie informacji diagnostycznych może być kontrolowane przy pomocy parametru –d*. Pozwala to na bardzo subtelną kontrolę. |
–diag_remark | brak | ||
–diag_suppress | brak | ||
–diag_warning | brak | ||
–diagnostics_tables | brak | ||
–discard_unused_publics |
–discard-all –discard-locals |
2.1, dokumentacja linkera ld | Odrzuca nieużywane symbole publiczne (w IAR EmbeddedWorkbench). GCC pozwala na kontrolę odrzucania różnych typów symboli. |
–dlib_config | brak | brak | Określa plik konfiguracji biblioteki. |
-e |
-std=gnu90 -std=gnu99 -std=gnu++98 |
3.4 | Włącza rozszerzania języka zgodne z C90, C99 i C++98. |
–ec++, –eec++ | -fno-* | 3.5 | Wyłącza konkretne cechy C++. |
–enable_hardware… _workaround |
brak | Włącza specyficzne obejścia sprzętowe. | |
–enable_multibytes | brak | Włącza obsługę znaków wielobajtowych w plikach źródłowych. Domyślne zachowanie GCC. | |
–endian |
-mlittle-endian -mbig-endian |
3.1732 | Określa kolejność bajtów w wygenerowanym kodzie i danych. |
–enum_is_int | -fshort-enums | 3.18 | Określa rozmiar typu wyliczeniowego. |
–error_limit | brak | Określa dozwoloną liczbę błędów przed zatrzymaniem kompilacji. |