2012-11-27 7 views
5

Visual Studio 2012で最も簡単な種類の新しいMFCアプリケーションを作成し、MFCに静的にリンクするように設定すると、リンクは失敗します。スタティックにMFCをリンクするときの未修正のVisual Studio 2012 MFCテンプレートのリンクエラー

ウィザードによるプロジェクトの作成からビルダーまでの(リンカーエラーの結果)までのgallery of 7 screenshotsです。 ソース編集が間に合わなかった。

エラー状態をログに記録します。

1>------ Build started: Project: Test, Configuration: Debug Win32 ------ 
1> stdafx.cpp 
1> TestDlg.cpp 
1> Test.cpp 
1> Generating Code... 
1>uafxcwd.lib(afxctrlcontainer2.obj) : error LNK2005: "void __cdecl AfxRegisterMFCCtrlClasses(void)" ([email protected]@YAXXZ) already defined in afxnmcdd.lib(afxctrlcontainer2.obj) 
1>uafxcwd.lib(afxctrlcontainer2.obj) : error LNK2005: "protected: void __thiscall CMFCControlContainer::PreUnsubclassControl(class CWnd *)" ([email protected]@@[email protected]@@Z) already defined in afxnmcdd.lib(afxctrlcontainer2.obj) 
1>uafxcwd.lib(afxctrlcontainer2.obj) : error LNK2005: "public: int __thiscall CMFCControlContainer::SubclassDlgControls(void)" ([email protected]@@QAEHXZ) already defined in afxnmcdd.lib(afxctrlcontainer2.obj) 
1>C:\Users\XXXXXXXX\Documents\Visual Studio 2012\Projects\Test\Debug\Test.exe : fatal error LNK1169: one or more multiply defined symbols found 
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ========== 

は、これは私だけですか?これに対処する方法についての提案がありますか?

+2

私が推測する危険があったら、ウィザードが壊れていると言うでしょう。静的なMFCとCRTにリンクしている場合は、[afx.hからの自動マジックセットアップ](http://msdn.microsoft.com/en-us/library/bx5yfk7t.aspx)がこれを処理します。あなたがUnicodeサポートでコンパイルしているとしたら(これはあなただと思いますが、最近誰がいないのですか?)、適切なlibはstatic-unicode-debugの 'uafxcwd.lib'と思われます。 2番目のlibが全く存在しないか、リンカーの順序が間違っていてもかまいません。私はあなたがPCHファイルを吹き飛ばした後にUnicodeをサポートして再構築するなら、何が起こるか知りたいと思うでしょう。 – WhozCraig

+1

私はこれをバグとしてMicrosoftに報告するべきだと思います。私はあなたがVS 2012のヘルプメニューからそうすることができると思います。そして、リンカオプションから 'afxnmcdd.lib'のような偽のライブラリをすべて削除し、' uafxcwd.lib'を追加してください。おそらく '/ NODEFAULTLIBS'を追加してください。 –

+0

@ warren-p私は同意します。私は間違いなくこの問題をたどる頭痛を他人に救うためにそうしています。うまくいけば(?)それは実際のバグであり、私のセットアップに特有のものではありません。 – Paul

答えて

4

私は私のプロジェクトを静的リンクするときに同じ問題が発生しました。

Michael Burrが示唆したように、stdafx.hの#define _AFX_NO_MFC_CONTROLS_IN_DIALOGSの行をコメントアウトした後は問題ありません。

2

私は同じ問題を抱えています。 #define _AFX_NO_MFC_CONTROLS_IN_DIALOGSを決めてMFCのオーバーヘッドを取り除く場合は、ダイアログベースクラス、メソッド呼び出しなどをCDialogExからCDialogに変更することを確認する必要があります。

ダイアログの背景色や画像を変更しないと、とにかくCDialogExが役に立たないことがわかります。