Я просто переместил некоторый код с одной платформы на другую, что потребовало изменения версий компилятора. Два из служебных источников вызвали проблемы с связью с неопределенными символами, в этом примере их называют 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 и затем включал его «волшебным образом», чтобы избежать этой проблемы. Но есть ли у кого-нибудь лучшее объяснение?