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