Може ли някой да обясни тази разлика в линкера между g++ 3.4.2 и g++ 4.1.2?

Току-що преместих някакъв код от една платформа на друга, което изискваше промяна във версиите на компилатора. Два от източниците на помощни програми причиниха проблеми при свързването с недефинирани символи, за този пример ги наречете Foo.c и Foo.h.

Всичко се компилира и свързва добре с g++ 3.4.2 и си помислих, че преминаването към g++ 4.1.2 ще бъде безсмислено. При използване на 4.1.2 компилацията върви добре, но свързването е неуспешно поради недефинирани символи. Символите за всяка функция във Foo, които са били използвани в други изходни файлове, т.е. Bar.c, бяха недефинирани, въпреки че Foo.h беше включен в Bar.c.

Проблемът беше, че файлът Foo.c не включваше Foo.h. Така че въпросът е как g++ 3.4.2 свърза този код, когато 4.1.2 не можеше? Предполагам, че 3.4.2 очакваше .h файл и след това го включи "магически", за да избегне този проблем. Но има ли някой по-добро обяснение?


person Mark Thistle    schedule 24.03.2009    source източник


Отговори (1)


Има разлика в ABI между 3.4 и 4.1, така че се уверете, че сте почистили и прекомпилирали проекта. И актуализира всички библиотеки, срещу които се свързвате.

person sfossen    schedule 24.03.2009