82

Visual Studio 2010(C ++)からの重要な警告に、頭を殴られたばかりです(ほとんどありません)。

コンパイルにより、次の出力が得られました。

1 Debug \ is.obj:警告LNK4042:オブジェクトが複数回指定されました。エクストラは無視され
ます1Debug\ make.obj:警告LNK4042:オブジェクトが複数回指定されました。エクストラは無視され
ます1Debug\ view.obj:警告LNK4042:オブジェクトが複数回指定されました。エクストラは無視されます1identity.obj:エラーLNK2019:関数(?identity @ 0test @@ YAXXZ )で参照される
未解決の外部シンボル(?view @ entity @ test @@ YAXXZ) 1 Identity.obj:エラーLNK2019:未解決の外部シンボル(?make @identity @ test @@ YAXXZ)関数で参照(?identity @ 0test @@ YAXXZ) 1 range.obj:エラーLNK2019:関数(?range @ 0test )で参照される未解決の外部シンボル(?is @ range @ test @@ YAXXZ)@@ YAXXZ) void __cdecl test::identity::view(void)void __cdecl test::identity::identity(void)
void __cdecl test::identity::make(void)void __cdecl test::identity::identity(void)
void __cdecl test::range::is(void)void __cdecl test::range::range(void)

リンカーエラーは常にデバッグするのが面倒です...しかし、未解決の参照があったので、チェックしました...しかし、ソースは整形式です...そして最後にそれは私を襲いました:

私のフォルダ階層は次のようになります。

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

ソリューションの階層も同様です(「実際の」フォルダー構造を模倣するように常に設定しています)。

そして診断出力:

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

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

これ以上検索しない:Visualはフォルダ階層をきちんとフラットにしているため、ソースをきちんとコンパイルできません。

現時点では、ファイルの名前を変更することを考えています。これで問題が解決するはずです...

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

4

10 に答える 10

155

リンカ警告LNK4042で同様の問題が発生しました。オブジェクトが複数回指定されました。エクストラは無視されます。私の場合、VisualStudioは同じ名前のヘッダーファイルとソースファイルの両方をコンパイルしようとしていました-MyClass.hMyClass.cpp.cppこれは、ファイルの名前をに変更し.h、VisualStudioが混乱したために発生しました。Debugディレクトリ内のコンパイラログを見て、問題に気づきました。解決するに.hは、プロジェクトからファイルを削除してから、もう一度追加します。

于 2011-06-13T17:11:55.890 に答える
100

C/C++ -> Output Files -> "Object File Name"プロジェクト全体のプロパティを開いて、下の値を次のように変更した場合、私が答えだと思うものをクロスポストしたかっただけです。

$(IntDir)/%(RelativeDir)/

VS 2010では、これによりすべてのオブジェクトファイルが明確になると思います(Windowsでは、クレイジーな状況では、同じディレクトリに同じ名前の2つのファイルを含めることができないと思います)。詳細はこちらもご覧ください。

于 2010-09-16T23:29:49.303 に答える
8

[ソリューションエクスプローラー]ウィンドウ、[プロパティ]、[C / C ++]、[出力ファイル]、[オブジェクトファイル名]の設定で.cppファイルを右クリックします。デフォルトは$(IntDir)\、フラット化を行っていることです。すべての.objファイルは、デバッグ構成の「Debug」ディレクトリである$(IntDir)に配置されます。

たとえば、設定を変更できます$(IntDir)\is2.obj。または、1つのグループからすべてのファイルを選択し(Shift +クリックを使用)、設定を次のように変更します。$(IntDir)\identity\

または、.cppファイル名を変更して、.objファイルが相互に上書きしないようにすることもできます。2つのディレクトリにまったく同じ名前のファイルがあるのは少し奇妙です。

または、複数のプロジェクトを作成して、たとえば、IDと範囲のファイルに対して.libプロジェクトを作成することもできます。たとえば、makefileプロジェクトで一般的に行われます。ただし、プロジェクトのプロパティシートを使用しない限り、コンパイルとリンクの設定を管理するのは面倒です。

于 2010-09-12T14:49:12.093 に答える
8

ヘッダーファイル->プロパティ->ItemTypeを右クリックします(C / C ++ヘッダーを選択します)。Cppファイルでも同じことを行いますが、C / C ++コンパイラを選択します(私にとってはうまくいきます)

于 2015-01-01T17:28:39.820 に答える
4

新しいファイルを削除して作成する代わりに、コンパイル/インクルード設定を変更できます。

project.vcxprojファイルに移動し、エディターで開いて、行のようなhtmlを見つけます<ItemGroup>

次のようになります。

<ItemGroup>
<ClCompile Include="implementation.cpp" />
</ItemGroup>

<ItemGroup>
<ClInclude Include="declaration.hpp" />
</ItemGroup>`

実装ファイルが.cppであり、宣言が.hppであると仮定します。複数の宣言ファイルがある場合は、最初のセクションの間にすべての実装ファイルがリストされていることを確認してください。複数の宣言ファイルの場合は、2番目のセクションにも同様にリストされています。

于 2013-03-05T21:16:18.947 に答える
4

C / C ++->出力ファイル->「オブジェクトファイル名」の下で$(IntDir)\%(Directory)\を使用します。

于 2013-03-19T23:15:21.537 に答える
3

stdafx.cppでこの問題が発生しました。どういうわけかstdafx.cppが複製されたので、2番目のStdAfx.cppがありました(別のケースに注意してください)。

StdAfx.cppを削除した後、すべてが正常に機能しました。

VS2010を使用します。

于 2013-01-11T17:55:08.150 に答える
2

以前は、同じプロジェクトに同じファイル名の.cファイルと.cppファイルがありました。ファイルはいたるところにあるフォルダにあり、他の人が提供したソリューションは混乱を引き起こし、フォルダは地獄になりました(私の場合)。リリースビルドでさえ、デバッグビルドを上書きします!

良い(完璧ではない)解決策は$(ParentName)を使用することですが、何らかの理由で、それはVisual Studio(2015+)の新しいバージョンから削除されました。

私が今うまく使っているのは、$(IntDir)%(Filename)%(Extension).objです。

これは、少なくとも.cビルドオブジェクトファイルを.cppから分離します。

于 2017-03-16T15:31:06.750 に答える
0

ItemTypeのがからに.h file変わる理由の1つを指摘したいと思います。C/C++ headerC/C++ compiler

  1. VS(ここでは2019)のSolution Explorerウィンドウで、プロジェクト名を右クリックし、Add -> New Item;を選択します。
  2. C++ File (.cpp)テンプレートを選択しsomething.hますが、名前入力領域に入力し、クリックOKして追加します。
  3. 次に、ファイルが複数LNK4042のファイルに含まれている場合、警告が表示されます。something.h.cpp
于 2021-04-30T07:41:43.780 に答える
0

私はちょうど同様のエラーメッセージを克服しました、そして以下の手順でもっとたくさん。症状:特定のヘッダーで定義されたすべての関数の呼び出しごとに1つのリンカーエラーに加えて、ヘッダーで定義されたすべての関数の出力の最後に1つのリンカーエラー。

次に、このヘッダーを最初に作成したときに、誤って「add-> new item-> c ++ file」を選択したことを思い出しました。「whatever.h」という名前を付けましたが、VisualStudioでは両方とも同じ種類のファイルと見なされていたようです。間違ったアクションのために、私はそれを追加するために使用しました。 ビルド出力ログを調べると、これが明らかになりました。

ソリューション(VS Community 2019を使用)

  1. 最初にプロジェクトをバックアップします(念のため)。
  2. 問題のあるヘッダーファイルを右クリックし、[プロジェクトから除外]を選択します(これにより、それらは削除されません。VSプロジェクトはそれらを無視します)。
  3. 一致する.cまたは.cppファイルについても同じようにします。
  4. プロジェクトでビルド->クリーンアップを実行します
  5. プロジェクトでビルド->再ビルドを実行します-もちろんエラーが発生します---
  6. [ヘッダーファイル]->[追加]->[既存のアイテム]を右クリックし、.hファイルを選択します
  7. [ソースファイル]->[追加]->[既存のアイテム]を右クリックして、.cまたは.cppファイルを選択します
  8. プロジェクトで[ビルド]->[再ビルド]を実行します。

これにより、完全にクリーンアップされ、この質問のタイトルからLNK4042を含む多くの苛立たしいリンカーエラーが軽減されました。

于 2021-11-09T12:42:29.967 に答える