2009-07-07 5 views
1

私はMSVC++ 6を使用して非常に大きなプロジェクトを構築しています。このプロジェクトのソースファイルの一部は、アプリケーションの保守に使用する小さなユーティリティと共有されています。以前は、この小さなユーティリティは、メインアプリケーションから多くのライブラリとのリンクを必要とし、実行時にメインアプリケーションのDLLも必要でした。私はこれらの依存関係を取り除くことを任されていましたが、これは非常に単純なものでした...残念なことに、メインアプリケーションで使用されているプリコンパイルされたヘッダーは私に多くの問題を引き起こしています。プリコンパイルされたヘッダーを使用するプロジェクト内の一部のファイルの依存関係を再構築するとリンカーエラーが発生する

私は最初に、必要なものをすべて明示的に組み込むようにユーティリティのすべてのファイルを書き直してから、PCHの#includeディレクティブを削除しました(これはユーティリティの不要な依存関係の95%を削除しました)。これはユーティリティをコンパイルするのに最適です。しかし、現在、メインアプリケーションをコンパイルすると、プリコンパイルされたヘッダーディレクティブが見つからないというエラーが表示されます。私は「偉大な、私は条件付きでPCHを含めるだろう」と思った。これは動作していないようです...私は "予期しない#endif"を得た、と述べたようにhere。私の次の考えは、ユーティリティとメインアプリの間で共有されている3つのソースファイルのメインアプリでPCHを無効にすることでした。これは正常にコンパイルが、私はリンク時に次のようになり、エラーの束を得る:

tls7d.lib(tls707d.dll) : error LNK2005: "public: unsigned int __thiscall RWCString::length(void)const " ([email protected]@@QBEIXZ) already defined in stripledescypher.obj 

AFAICT、多重定義されたシンボルの全ては、PCHの必要性を回避するために、私は明示的に共有ファイルに含めるものです。私の感想は、これらの3つのファイルをPCH .cppファイルと同じDLLにリンクしているので、複数の場所でコンパイルされていることです。この混乱から脱出する方法はありますか?私は何でもしようとします...

答えて

1

コンパイル単位を処理するときにコンパイラがシンボルXの定義を見つけたら、リンカのヒントを作成します:Xはここにあります!

定義(つまり単なる宣言ではない)という2つのソースファイルをコンパイルすると、同じシンボルを定義する2つのオブジェクトファイルが作成されます。リンカーはシンボルを複数定義しています。

したがって、あなたのstripledescypherオブジェクトファイルにはWCString::lenght()constメソッドの定義が含まれているようです。これは、関数の本体がクラスのヘッダーなどに定義されていることが原因です。

関連する問題