web-dev-qa-db-ja.com

エラーLNK2005:LIBCMTD.lib(new.obj)で既に定義されている新規および削除

2つのプロジェクトがあるVisual Studio 2005ソリューションがあります。 1つは静的ライブラリで、もう1つは静的ライブラリの機能をテストするために使用される実行可能ファイルです。静的ライブラリはMFCを使用します。ソリューションを構築したときに、次のエラーが発生しました。

uafxcwd.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new(unsigned int)" (??2@YAPAXI@Z) already defined in LIBCMTD.lib(new.obj)
uafxcwd.lib(afxmem.obj) : error LNK2005: "void __cdecl operator delete(void *)" (??    3@YAXPAX@Z) already defined in LIBCMTD.lib(dbgdel.obj)
uafxcwd.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new[](unsigned int)" (??_U@YAPAXI@Z) already defined in libcpmtd.lib(newaop.obj)
uafxcwd.lib(afxmem.obj) : error LNK2005: "void __cdecl operator delete[](void *)" (??_V@YAXPAX@Z) already defined in LIBCMTD.lib(delete2.obj)

これを克服する方法がわかりません。このエラーが発生する理由を説明してください。 .libファイルのリンケージの概要を示す説明は、高く評価されます。

31
user59988

CRTライブラリは、new、delete、およびDllMain関数に弱い外部リンケージを使用します。 MFCライブラリには、新しい関数、削除関数、およびDllMain関数も含まれています。これらの関数では、CRTライブラリをリンクする前にMFCライブラリをリンクする必要があります。 http://support.Microsoft.com/kb/148652

VS2005に基づくソリューション(〜VS2013のNafxcwd.libをUafxcwd.libに置き換えます)

プロジェクト>プロパティ>構成プロパティ>リンカー>入力に移動します

「追加の依存関係」に追加-> Nafxcwd.lib Libcmtd.lib

「特定のライブラリを無視」に追加-> Nafxcwd.lib; Libcmtd.lib

ライブラリの順序は重要です(Nafxcwd.lib; Libcmtd.lib)。

63
ali

試すべきことの1つは、次のことを確認することです。

#include "stdafx.h"

.cppファイルの最初の行として。私はそれがすべての場合の答えではないと確信していますが、私の場合は同じエラーがなくなりました。

11
Andrew Jens

構成リンカー入力

  • 追加の依存関係ではafxcw.lib; LIBCMT.lib
  • 特定のput putを無視afxcw.lib; LIBCMT.lib
5
eit

Visual Studio 2010のMFCソリューションでこの問題を解決し、Project-> PropertiesでUse MFC in a Shared DLLUse MFC in a Static Libraryに変更します->構成プロパティ->一般

次の方法で問題を解決します。最初にProject-> Properties-> Configuration Properties-> Linker-> Inputを見つけてください。

デバッグモードの場合:

  • Additional Dependenciesuafxcwd.lib;Libcmtd.libを追加します。
  • 特定のデフォルトライブラリを無視するuafxcwd.lib;Libcmtd.libを追加します。

リリースモードの場合:

  • Additional Dependenciesuafxcw.lib;Libcmt.libを追加します。
  • 特定のデフォルトライブラリを無視するuafxcw.lib;Libcmt.libを追加します。

通知:

  1. 2つの;ファイルの間の.libをお見逃しなく。
  2. 接尾辞-dをデバッグモードのファイルに追加する必要があります。
5
Cipher Saw

必ず#include <afx.h> in "stdafx.h"その他のインクルード#include <string>

5
user2199593

リンクしているC++ランタイムライブラリが、静的ライブラリと実行可能ファイルで同じであることを確認してください。プロジェクトプロパティC/C++->コード生成->ランタイムライブラリ設定を確認します。

3
msvcyc

打ち間違え。あなたが得た1つの愚かな方法は、ヘッダーを含める代わりに、cppを含めることです。例えば.

#include <myclass.cpp> //should be #include <myClass.h>
2
Gob00st

私にとっては、_CRTDBG_MAP_ALLOCでコンパイルされた静的ライブラリと、_CRTDBG_MAP_ALLOCでコンパイルされていないアプリケーションがあり、LNK2005を受け取っていました。 _CRTDBG_MAP_ALLOCでコンパイルするようにアプリケーションを変更しましたが、LNK2005は表示されなくなりました。

1
boutinr

まず、libcmtd.libはデバッグバージョン用で、libcmt.libは本番用です。両方が含まれていないことを再確認してください。確認する1つの場所は、構成プロパティ/リンカープロジェクトプロパティの「コマンドライン」セクションです。

プロジェクトのプロパティに移動して、構成プロパティ/リンカー/入力セクションを開くと、「特定のライブラリを呼び出す」...そのフィールドにlibcmtd.libを一覧表示できます。

1
Mark Laff

私にとっては、問題を解決することで解決しました

プロジェクト->プロパティ->構成プロパティ->一般:MFCの使用=共有DLLでMFCを使用

「標準Windowsライブラリを使用する」に設定される前

さらに、/ MDオプションを設定する必要がありました

プロジェクト->プロパティ-> C/C++->コード生成:ランタイムライブラリ=マルチスレッドDLL(/ MD)

0
flexo

私はVS2017で2つの新しいプロジェクトを作成しましたが、1つはもう1つのプロジェクトを作成していました。働くものはで作成されました
File > New Project > Visual C++ > MFC/ATL > MFC Application
動作していないものはで作成されました
File > New Project > Visual C++ > Windows Desktop > Windows Desktop Wizard
次にMFCを追加します。どちらの場合も、MFCを静的ライブラリとして使用していました。私は2つの修正を見つけました。しかし、2番目のプロジェクトにはNONEがあったため、その前にインポートを追加する必要があります!

#include <afxwin.h>         // MFC core and standard components
#include <afxext.h>         // MFC extensions
#include <afxdisp.h>        // MFC Automation classes

これで、2つの修正のいずれかが機能しました。

  1. Project > Properties > Configuration Properties > General > Use of MFC共有DLLで使用するように設定します。これにより、自動的に設定されますC/C++ > Code Generation > Runtime LibraryからMulti-threaded debug dll /MDd実際にそれを行ったことを確認してください。今すぐコンパイルしてみてください、私にとってはうまくいきました。
  2. 作業中のプロジェクトがstdafx.hにいくつかのインポートを持っていることに気付き、それらを他のプロジェクトのpch.hにコピーし、動作しました(プロパティを変更せずに維持したため、静的ライブラリが使用されました)。コピーされたコードは次のとおりです。
#define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS      // some CString constructors will be explicit

// turns off MFC's hiding of some common and often safely ignored warning messages
#define _AFX_ALL_WARNINGS
#include <afxwin.h>         // MFC core and standard components
#include <afxext.h>         // MFC extensions


#include <afxdisp.h>        // MFC Automation classes

リンカーの設定を変更する他のソリューションは試してみましたが、機能しませんでした。
誰かが私のソリューションが機能する理由を知っていて、それが奇妙で、なぜそれらのヘッダーをpch.hはリンカーの問題を解決しますが、同じヘッダーを他の場所に含めるとエラーが発生しますか?

0
Melardev

変数を宣言および定義したヘッダーファイル。可能な解決策は次のとおりです。hで変数を宣言します:extern BOOL MyBool;その後、.cまたは.cppファイルでBOOL MyBool = FALSE;に割り当てます。変数staticを宣言します。変数selectanyを宣言します。

https://msdn.Microsoft.com/en-us/library/72zdcz6f.aspx

0
usman chaudhry

また、new/delete演算子を置換した場合(および配列とスカラーの両方を実行してください)、objがlibと衝突しないように__forceinlineとしてタグ付けする必要がある場合があることも追加します。

たとえば、私はこれらをアラインされた割り当てを強制するために行い、それを行うまで同じトラブルを抱えていました:

__forceinline void * operator new(size_t size)
{
    return _aligned_malloc(size, 16);
}
__forceinline void operator delete(void* ptr)
{
    _aligned_free(ptr);
}
__forceinline void * operator new [](size_t size)
{
    return _aligned_malloc(size, 16);
}
__forceinline void operator delete [](void* ptr)
{
    _aligned_free(ptr);
}
0
Dave

同様の問題もありました。ドニーが提供したリンクはその理由を説明しています。解決策は、エラーメッセージを確認し、関連するライブラリを削除し、MFCライブラリ、CRTライブラリの順にそれらのライブラリを追加することでした。

Vs2008でそれを行う方法はALiによって与えられます。

0
user36476

両方のプロジェクトのマニフェストファイルを確認し、同じバージョンの標準ライブラリをリンクしていることを確認してください。ほとんどの場合、そうではありません。プロパティ->コード生成->標準ライブラリリンクを確認してください。

0
DeusAduro