Po pierwsze, porozmawiajmy trochę o twoim problemie. Myślę, że najbardziej prawdopodobną przyczyną błędu systemu w jednym systemie jest drugi kod, który nie jest identyczny; możesz to sprawdzić za pomocą jakiegoś narzędzia lub polecenia diff
, aby wyszukać subtelne zmiany, które pojawiły się w bazie kodu. Zwykle, gdy widziałem problemy z tego typu błędów, masz coś takiego:
typedef struct Foo* Fooptr;
w pliku nagłówka, a następnie:
typedef struct Foo
{
int bar;
} *Fooptr;
w pliku źródłowym. Co oznacza, że możesz po prostu upuścić typedef w źródle i powinno być OK. Po prostu coś do znalezienia.
Teraz jeśli jestgcc
problem, druga opcja, aby rozwiązać Twój problem jest, to możliwe have multiple versions of gcc on the same computer a następnie określić dokładną wersję gcc
do uruchomienia z pomocą opcji -v
. Dobrym pomysłem jest nadanie 4.1.2 ujęcia na maszynie Fedory 18.
Inna uwaga, jeśli używasz opcji -v
, ale nie określić wersję gcc
uruchomić, dostaniesz (na wyjście stderr) poleceń wykonywanych uruchomić etapy kompilacji. Może to być przydatne, aby zobaczyć, co się dzieje i czy istnieją istotne różnice między tym, co dzieje się na każdym komputerze.
OK, teraz na twoje pytania. Tak, istnieją flagi do kompilacji na "wersji X" z gcc
: Na początek jest __VERSION__
Predefined Macro, to spit z powrotem do ciebie const char *
numeru wersji. Może to być bardzo przydatne, ale jak gcc dokumentacji stwierdza:
Nie należy polegać na jego zawartość mających żadnej szczególnej formy, ale może liczyć na zawierać co najmniej numer wersji
Mimo to zazwyczaj widziałem tylko jedną formę wyjścia, która jest podobna do "4.6.3"
, jeśli moja wersja gcc
to 4.6.3-1ubuntu5
.
Teraz jeśli wiesz (lub podejrzany), że część kodu spowoduje konkretnej wersji gcc
powodować błędy można użyć __GNUC__
, __GNUC_MINOR__
i __GNUC_PATCHLEVEL__
predefiniowanych makr do „chronić” siebie:
Oto krótki wycinek-to pokazano na najwyższym poziomie, jak go używać:
#if __GNC__ == 3
printf(“Hello version 3.x.x\n”);
#elif __GNC__ == 4
printf(“Hello version 4.x.x\n”);
#endif
więc na powyższym układzie, gdzie wersja to 4.6.3 chcesz zobaczyć komunikat „Hello wersja 4.xx”. Następnie można uzyskać bardziej zaawansowane i sprawdzić subversions także:
#if __GNUC__ > 3 || \
(__GNUC__ == 3 && (__GNUC_MINOR__ > 2 || \
(__GNUC_MINOR__ == 2 && \
__GNUC_PATCHLEVEL__ > 0))
printf(“I’m a gcc greater than 3.2.0\n”);
#endif
Albo czystszą wersję tego za pomocą własnego makro:
#define GCC_VERSION (__GNUC__ * 10000 \
+ __GNUC_MINOR__ * 100 \
+ __GNUC_PATCHLEVEL__)
#if GCC_VERSION > 30200
printf(“I’m a gcc greater than 3.2.0\n”);
#endif
Aby zaadresować pytanie czy różnych wersjach gcc
będzie generował różne błędy, masz rację, że w każdym wydaniu gcc
dzieje się więcej, a czasem coś się zmienia, więc zobaczysz różnice między różnymi wersjami kompilatora. Najlepiej jest sprawdzić informacje o wydaniu dla każdej wersji pomiędzy tymi dwoma, na których jesteś. (od 4,1 do 4,7).
nie jestem pewien jaka masz architekturę docelową, więc upewnij się, że sprawdzasz te sekcje w każdym z dokumentów. Ale myślę, że naprawdę chcesz rzucić okiem na "Build system improvements"
i "Incompatible changes to the build system"
, tworzą także sekcję specyficzną dla kodu C, która może być przydatna do przejrzenia.
Tak, różne kompilatory/wersje/flagi mogą dawać różne wyniki, szczególnie. w kodzie # # ifdef'. –
jeśli chodzi o "flagi, które mogę ustawić, aby tego uniknąć w przyszłości", czy moja odpowiedź na to pozwala, czy też myślisz o czymś innym? – Mike
niektóre przydatne informacje byłyby miłe, bardziej prawdopodobne jest, że będą zawarte w nagłówku innym w systemie niż w kompilatorze, ale nigdy nie wspomnisz, gdzie są channel.h lub internal.h i jak są uwzględniane. otaczające linie wokół miejsca, w którym pojawia się channel_t, również by się przydały ... przynajmniej do ifdefs. Twoja świetlówka CFLAG bez niczego definiuje średnią absolutnie nic. – technosaurus