0

同じ名前の機能を持つ 2 つのプロジェクトを含む VS10 ソリューションがあります。リンカーは、(同じ名前の 2 つの関数の) 2 番目の定義が無視されることについて不平を言います (警告をスローします)。

warning LNK4006: "void __cdecl function_name(short *,class Bbox *,int,int,struct FILE_NAMES *,unsigned char *)" (?function_name@@YAXPAFPAVBbox@@HHPAUFILE_NAMES@@PAE@Z) already defined in XXX.lib(segment.obj); second definition ignored

これにより、2 番目のプロジェクト (無視されたプロジェクト) の関数への呼び出しが最初のプロジェクトの関数を指すようになります (定義が無視されるため)。

私の質問は: 2 つのプロジェクトで同じ名前を持つすべての関数の名前を変更する以外に、この問題を回避/解決する方法はありますか? たとえば、ヘッダー ファイルに #if/pragma を追加するか、.obj ファイルを操作します。現実には、どのコンパイルでも 2 つのプロジェクトのうちの 1 つだけが必要なソリューションであるため、条件付きコンパイルの簡単な方法で問題ありませんが、私の最初の好みは、両方のプロジェクトを一緒にコンパイルすることです。

4

1 に答える 1

1

これは、テンプレート、型、関数、またはオブジェクトの定義がプログラム全体に1 つだけ存在する可能性があるという1 つの定義規則に違反しています。この問題を解決するには、両方の関数の署名を名前またはパラメーターのオーバーロードによって一意にするか、それらを異なる名前空間に配置するか、両方のライブラリが同時に必要な場合は条件付きコンパイルを使用します。

于 2013-05-21T20:24:59.513 に答える