1. ホーム
  2. c++

[解決済み] Visual Studio 2010のおかしな警告LNK4042について

2023-06-14 06:05:18

質問

Visual Studio 2010 (C++) からのいくつかの非自明な警告によって、私は頭を (ほとんど) 叩かれました。

コンパイルでは次のような出力がありました。

1 Debugis.obj : warning LNK4042: object specified more than once; extras ignored.

1 Debug ○○make.obj : warning LNK4042: object specified more than once; extras ignored.

1 Debugview.obj : warning LNK4042: object specified more than once; extras ignored.

1 identity.obj : error LNK2019: 未解決の外部シンボル void __cdecl test::identity::view(void) (?view@identity@test@YAXXZ) 関数で参照されています。 void __cdecl test::identity::identity(void) (?identity@0test@YAXXZ)です。

1 identity.obj : error LNK2019: 未解決の外部シンボル void __cdecl test::identity::make(void) (?make@identity@test@YAXXZ) 関数で参照されています。 void __cdecl test::identity::identity(void) (?identity@0test@YAXXZ)です。

1 range.obj : error LNK2019: 未解決の外部シンボル void __cdecl test::range::is(void) (?is@range@test@YAXXZ) 関数で参照されています。 void __cdecl test::range::range(void) (?range@0test@YAXXZ)である。

リンカーエラーはいつもデバッグに苦労する...しかし、未解決の参照があったので確認すると...ソースは整形されている...そしてついに閃いたのだ。

私のフォルダー階層は以下のような感じです。

src/
  identity/
    is.cpp
    make.cpp
    view.cpp
  range/
    is.cpp
    make.cpp
    view.cpp

で、ソリューションの階層も同様です (私は常に "real"のフォルダ構造を模倣するように設定します)。

そして診断の出力です。

Debug\is.obj
Debug\make.obj
Debug\view.obj

という警告とともに .obj がリンカに2回渡され、そのうちの1回は無視されるという警告とともに。

もう検索できません。Visual は私のフォルダー階層をきちんと平らにし、したがって、ソースをきちんとコンパイルすることができません。

今のところ、私は単にファイル名を変更することを考えており、それで問題をカバーできるはずです。

... しかし、Visual Studio がファイル階層を平坦化しないようにする方法はありますか?

どのように解決するのですか?

私が答えだと思うことをクロスポストしたいと思います。プロジェクト全体のプロパティを開き、その中の C/C++ -> Output Files -> "Object File Name" の値を次のように変更します。

(IntDir)/%(RelativeDir)/のようになります。

VS 2010では、これですべてのオブジェクトファイルが曖昧さをなくすことができると思います(Windowsでは、どんなおかしな状況でも、同じディレクトリに同じ名前のファイルを2つ持つことはできないと思うので)。 詳細も確認してください。 はこちら .