4

この質問は何度も提起されてきましたが、VisualStudioは私に挑戦することをやめません。

自給自足である必要がある、つまりサードパーティのライブラリに依存しないアプリケーションがあります。MT(d)これが、コード生成フラグを使用してすべてを静的に構築する理由です。

Qtアプリは、、、およびzlibに依存します。これらのライブラリはすべて、。を使用して静的ライブラリとして構築されました。このアプリは関連するコードも使用しているため、リンクする必要があります。OpenSSLDCMTKMT(d)MFC

MFCは経由で含まれています

#include <afxwin.h>

これがすべてのファイルの最初のインクルードであるべきだとどこかで読みましたが、それが本当かどうかはわかりません。とにかく、その行はすべてのファイルに含まれているわけではなく、1つのファイルだけに含まれています。

リンク関連のエラーは次のとおりです。

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

これがリンカーの出力です。

多くのサイトの多くのスレッドと、MSDNのKBからのこの記事を読みました。しかし、MFCライブラリはCRTの前にリンクする必要があると彼ら全員が言い続けているので、彼らは私を助けませんが、リンクの順序を変更する方法を見つけることができません。

どんな助けでも大歓迎です。

編集1 :このスレッドのトリックを使用すると、実際に問題は解決しますが、ここで何が問題になっているのかを知りたいと思います。

編集2:Windows7およびQt4.6.3でのVisualStudio2008SP1の使用

4

2 に答える 2

4

問題は明らかです。CRTコードとMFCコードを一緒にコンパイルしているのです。

MFCライブラリを使用する場合は、CRTライブラリがリンクされる前にそれらがリンクされていることを確認する必要があります。これを行うには、プロジェクト内のすべてのファイルに、直接(#include)または間接的に(#include)、最初にMsdev \ Mfc \ Include\Afx.hが含まれていることを確認します。Afx.hインクルードファイルは、ディレクティブを使用して、ライブラリの正しい順序を強制します。

#pragma comment (lib,"<libname>")

Microsoftには、この問題を説明する記事(リンクはなくなりましたが、ここを確認してください)があり、2つの解決策を段階的に提案しています(次の手順はVisual C ++ 6.0に基づいています)。

解決策1:リンカーにライブラリを正しい順序でリンクさせる

  1. [プロジェクト]メニューで、[設定]をクリックします。
  2. [プロジェクト設定]ダイアログボックスの[設定]ビューで、リンクエラーが発生しているプロジェクト構成をクリックして選択します。
  3. [リンク]タブで、[カテゴリ]コンボボックスの[入力]をクリックして選択します。
  4. [ライブラリを無視する]ボックスに、ライブラリ名を挿入します(たとえば、Nafxcwd.lib; Libcmtd.lib)。

:で同等のリンカーコマンドライン/NOD:<library name>

  1. オブジェクト/ライブラリモジュール(VS2008:[プロパティ]->[構成プロパティ]->[リンカー]->[入力]->[追加の依存関係])ボックスに、ライブラリ名を挿入します。これらが順番に、最初の2つのライブラリとしてリストされていることを確認する必要があります。行(たとえば、Nafxcwd.lib Libcmtd.lib)。

解決策2:問題モジュールを見つけて修正する

現在のライブラリリンクの順序を表示するには、次の手順に従います。

  1. [プロジェクト]メニューで、[設定]をクリックします。
  2. [プロジェクト設定]ダイアログボックスの[設定]ビューで、リンクエラーが発生しているプロジェクト構成をクリックして選択します。
  3. [リンク]タブで、[プロジェクトオプション]ボックスに/ verbose:libと入力します。
  4. プロジェクトを再構築します。リンクプロセス中に、ライブラリが出力ウィンドウに一覧表示されます。
于 2010-08-27T16:25:20.227 に答える
0

これは、MSDNフォーラムで明確にされました: http://social.msdn.microsoft.com/Forums/en/vcgeneral/thread/4e331cb3-e566-4ca6-b7d4-118c3bebd31a

于 2010-08-29T10:41:46.983 に答える