2009-11-24 7 views
9

オブジェクトや関数の複数の定義を防ぐためにインクルードガードに依存するコードをコンパイルしていますが、Visual Studio 2008では複数の定義があるというリンクエラーが発生しています。私はこれまでと非常によく似たコードを使用していたので、なぜそれが問題を引き起こさなかったのか理解できません。私は何かばかなことをしているにちがいありませんが、私はそれが何であるか分かりません。また、インクルードガードを取り出して#pragmaを一度使用しようとしましたが、同じリンクエラーが発生します。私は何を確認すべきですか?なぜ、ガードやプラグマを使用していないのですか?

答えて

17

リンカーのエラーの場合は、ヘッダに定義されているインラインではない関数が考えられます。

複数のソースファイルに含まれるヘッダーにインラインでない関数がある場合、そのソースファイル(「翻訳単位」)のそれぞれに定義されるため、関数は一度、したがって、複数の定義エラー。

+0

はい、あなたは正しいです...おっと。ありがとう! – Stewart

+0

あなたはまたそれらをテンプレートにすることで弱い記号にすることもできます –

0

リンカエラーが発生している場合は... 1)実際にコードで2回機能を定義していない、または2)愚かなことをしようとしていますか?#includeソースファイル(ヘッダファイル)?

0

これは、他のライブラリのリンクインからcstdライブラリの異なるバージョンを使用することによっても発生する可能性があります。C++ /コード生成セクションをチェックし、すべてのプロジェクトが同じ設定を使用していることを確認します。