2005年10月31日月曜日

Visual C++: LNK4006

プロジェクトが大きくなってくると、dynamic link library (dll)やら、static link library (lib)を作って、プロジェクトを分割していきます。今日は、DLLを作成中に、LNK4006が多発してはまりました(-_-;; helpを見ると、以下の通り。

symbol
already defined in object; second definition ignored

The given symbol, displayed in its decorated form, was multiply defined. When this warning is encountered, symbol will be added twice, but only its first form will be used.

You can get this warning if you try to merge two import libs into one.

Tips

  • The given symbol may be a packaged function, created by compiling with /Gy. This symbol was included in more than one file but was changed between compilations. Recompile all files that include the symbol.
  • The given symbol may have been defined differently in two member objects in different libraries.
  • An absolute may have been defined twice, with a different value in each definition.
  • If the error message is received when combining libraries, symbol already exists in the library being added to.

If you are rebuilding the C run-time library, you can ignore this message.


で、原因はどうやら上の赤字の部分。十数分悪戦苦闘した結果、ライブラリを作成中に、static libraryをリンクするようにしていたことが問題だと発覚。

static link libraryを作るプロジェクトAとBがあって、両者はともに同じファイルCを参照しています。しかし、Cの実体(*.cpp)は、Aに含まれていま す。 すると、Bをlibraryとしてbuildするときに、Aで作成されたライブラリをリンクするように設定していたため、Bの中に、Aで定義されたCと、 BでincludeしたCが混ざってでてきてしまいました。 これがlnk4006の原因。

落ち着いて考えるとなんてことないし、まさにヘルプに書いてある通りのwarningがでているのだけれど。。。

日記さぼるとランキングがすぐにさがってしまいます(T-T)

0 件のコメント:

License

Creative Commons LicenseLeo's Chronicle by Taro L. Saito is licensed under a Creative Commons Attribution-Noncommercial-Share Alike 2.1 Japan License.