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ファイルのリンケージの概要を示す説明は、高く評価されます。
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)。
試すべきことの1つは、次のことを確認することです。
#include "stdafx.h"
.cppファイルの最初の行として。私はそれがすべての場合の答えではないと確信していますが、私の場合は同じエラーがなくなりました。
構成リンカー入力
Visual Studio 2010のMFCソリューションでこの問題を解決し、Project-> PropertiesでUse MFC in a Shared DLL
をUse MFC in a Static Library
に変更します->構成プロパティ->一般。
次の方法で問題を解決します。最初にProject-> Properties-> Configuration Properties-> Linker-> Inputを見つけてください。
デバッグモードの場合:
uafxcwd.lib;Libcmtd.lib
を追加します。uafxcwd.lib;Libcmtd.lib
を追加します。リリースモードの場合:
uafxcw.lib;Libcmt.lib
を追加します。uafxcw.lib;Libcmt.lib
を追加します。通知:
;
ファイルの間の.lib
をお見逃しなく。-d
をデバッグモードのファイルに追加する必要があります。必ず#include <afx.h>
in "stdafx.h"
その他のインクルード#include <string>
リンクしているC++ランタイムライブラリが、静的ライブラリと実行可能ファイルで同じであることを確認してください。プロジェクトプロパティC/C++->コード生成->ランタイムライブラリ設定を確認します。
打ち間違え。あなたが得た1つの愚かな方法は、ヘッダーを含める代わりに、cppを含めることです。例えば.
#include <myclass.cpp> //should be #include <myClass.h>
私にとっては、_CRTDBG_MAP_ALLOCでコンパイルされた静的ライブラリと、_CRTDBG_MAP_ALLOCでコンパイルされていないアプリケーションがあり、LNK2005を受け取っていました。 _CRTDBG_MAP_ALLOCでコンパイルするようにアプリケーションを変更しましたが、LNK2005は表示されなくなりました。
まず、libcmtd.libはデバッグバージョン用で、libcmt.libは本番用です。両方が含まれていないことを再確認してください。確認する1つの場所は、構成プロパティ/リンカープロジェクトプロパティの「コマンドライン」セクションです。
プロジェクトのプロパティに移動して、構成プロパティ/リンカー/入力セクションを開くと、「特定のライブラリを呼び出す」...そのフィールドにlibcmtd.libを一覧表示できます。
私にとっては、問題を解決することで解決しました
プロジェクト->プロパティ->構成プロパティ->一般:MFCの使用=共有DLLでMFCを使用
「標準Windowsライブラリを使用する」に設定される前
さらに、/ MDオプションを設定する必要がありました
プロジェクト->プロパティ-> C/C++->コード生成:ランタイムライブラリ=マルチスレッドDLL(/ MD)
私は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つの修正のいずれかが機能しました。
Project > Properties > Configuration Properties > General > Use of MFC
共有DLLで使用するように設定します。これにより、自動的に設定されますC/C++ > Code Generation > Runtime Library
からMulti-threaded debug dll /MDd
実際にそれを行ったことを確認してください。今すぐコンパイルしてみてください、私にとってはうまくいきました。#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
はリンカーの問題を解決しますが、同じヘッダーを他の場所に含めるとエラーが発生しますか?
変数を宣言および定義したヘッダーファイル。可能な解決策は次のとおりです。hで変数を宣言します:extern BOOL MyBool;その後、.cまたは.cppファイルでBOOL MyBool = FALSE;に割り当てます。変数staticを宣言します。変数selectanyを宣言します。
また、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);
}
同様の問題もありました。ドニーが提供したリンクはその理由を説明しています。解決策は、エラーメッセージを確認し、関連するライブラリを削除し、MFCライブラリ、CRTライブラリの順にそれらのライブラリを追加することでした。
Vs2008でそれを行う方法はALiによって与えられます。
両方のプロジェクトのマニフェストファイルを確認し、同じバージョンの標準ライブラリをリンクしていることを確認してください。ほとんどの場合、そうではありません。プロパティ->コード生成->標準ライブラリリンクを確認してください。