あるプラットフォームから別のプラットフォームにコードを移動したところ、コンパイラのバージョンを変更する必要がありました。ユーティリティソースのうちの2つは、未定義のシンボルとのリンクの問題を引き起こしました。この例では、それらをFoo.cおよびFoo.hと呼びます。
すべてがコンパイルされ、g ++ 3.4.2で正常にリンクされていたので、g++4.1.2への切り替えは簡単だと思いました。4.1.2を使用すると、コンパイルは正常に行われましたが、シンボルが定義されていないためにリンクが失敗しました。他のソースファイルで使用されたFooのすべての関数のシンボル。Foo.hがBar.cに含まれていても、Bar.cは未定義でした。
問題は、Foo.cファイルにFoo.hが含まれていないことでした。だから問題は、4.1.2ができなかったときにg ++3.4.2がこのコードをどのようにリンクしたのかということです。3.4.2は.hファイルを予期していて、この問題を回避するために「魔法のように」それを含めていたと思います。しかし、誰かがより良い説明を持っていますか?