43

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 ファイルのリンケージの概要を示す説明は、高く評価されます。

4

18 に答える 18

75

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

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

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

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

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

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

于 2009-11-16T10:50:33.247 に答える
16

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

#include "stdafx.h"

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

于 2011-10-06T04:12:34.143 に答える
3

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

于 2009-07-18T00:59:37.577 に答える
2

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

#include <myclass.cpp> //should be #include <myClass.h>
于 2012-04-27T15:49:36.627 に答える
1

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

于 2015-03-03T15:02:46.690 に答える
1

VS2017 で 2 つの新しいプロジェクトを作成しましたが、一方は機能していましたが、もう一方は機能していませんでした。その違いを比較しました。動作
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 LibraryMulti-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とリンカーの問題が解決するのに、同じヘッダーを他の場所に含めるとそのエラーがトリガーされるのはなぜですか??

于 2019-04-28T10:13:03.307 に答える
1

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

プロジェクトのプロパティに移動し、構成プロパティ/リンカー/入力セクションを開くと、「特定のライブラリを無視する」ことができます...そのフィールドに libcmtd.lib をリストしてみてください。

于 2009-07-18T01:04:50.510 に答える
0

また、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);
}
于 2015-08-15T00:49:29.530 に答える
0

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

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

于 2017-07-05T07:08:49.540 に答える
0

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

于 2009-07-18T00:59:25.737 に答える
0

この回答を探しているときに出くわした別の考えられる原因:

#include "StdAfx.h"アプリケーション (プリコンパイル済みヘッダーを使用) から共有静的ライブラリ (プリコンパイル済みヘッダーを使用しない) に移動した .cpp ファイルの先頭に誤って行を残してしまいました。

于 2021-08-13T16:28:31.150 に答える