5

更新: これはすべて本質的に偽物です。アプリケーションが実行されているマシンの Depends.exe のバージョンは 32 ビット バージョンであることが判明しました。それを修正すると、両方のマシンでシステム DLL が 64 ビットとして表示されるため、これは問題の原因ではありません。依存が32ビットexeでそのように表示される理由がわかりません。


さらに更新: 最終的に、問題は 1 つの 64 ビット DLL でした。これは、正しいバージョンの Dependency Walker を使用した後、見つけやすくなりました。32 ビット バージョンと 64 ビット バージョンの選択は、実行しているプラ​​ットフォームに基づいていません。よくある質問から:

Dependency Walker は、32 ビットまたは 64 ビットの Windows モジュールで動作します。32 ビット バージョンと 64 ビット バージョンの Dependency Walker があります。すべてのバージョンは、32 ビットおよび 64 ビット モジュールに対応しているか、開くことができます。ただし、32 ビットの Dependency Walker を使用して 32 ビット モジュールを処理し、64 ビットの Dependency Walker を使用して 64 ビット モジュールを処理することには、大きな利点があります。これは、32 ビット プログラムと 64 ビット プログラムの両方を実行できる 64 ビット バージョンの Windows で実行している場合に特に当てはまります。64 ビット Windows 上の 32 ビット サブシステム ("WOW64" として知られています) には、独自のプライベート レジストリ、"AppPaths"、"KnownDlls"、システム フォルダー、およびマニフェスト処理があります。32 ビット モジュールを正確に処理するために必要なこの 32 ビット環境にアクセスできるのは、32 ビット バージョンの Dependency Walker だけです。同じく、


あるマシンでは正しくビルドされ、別のマシンでは正しくビルドされないアプリケーションがあります。どちらも、BootCamp 経由で Wi​​ndows 7 を実行している MacBook Pro です。これらは、コンパイル/リンク ツールとして VS2010 を使用して QtCreator を介してビルドされています。

マシン A では、エラーが報告されることなくコンパイルおよびリンクされます。ただし、実行すると、0xc000007b エラー (STATUS_INVALID_IMAGE_FORMAT) で失敗します。Depends.exe は、exe が 32 ビット exe であるが、すべての Windows DLL (advapi32.dll など) が 64 ビット DLL としてリンクされていることを確認します。これはリンク時エラーのように見えますが、明らかにそうではありません。

マシン B では、すべてが正しくコンパイルされ、実行されます。Depends.exe は、exe とすべてのリンクされた DLL が 32 ビットであることを確認します。

私のQtプロジェクトは次のように構成されています:

qmake: qmake.exe PROJECT.pro -r -spec win32-msvc2010 "CONFIG+=declarative_debug"

この-spec win32-msvc2010部分は 32 ビット ビルドを指定するのに十分だと思います。

プロジェクト ファイルは、 C:/Program Files (x86)/Microsoft SDKs/Windows/v7.0A/Lib にある Windows インポート ライブラリ ファイルに明示的にリンクしています。これらが 32 ビット インポート ライブラリであることを確認しました。プロジェクト ファイル内の明示的な LIB+= 行は、このパスを呼び出します。プロジェクト ファイルからこの行を削除しても、リンクは成功します。そのため、その場合、Windows システムのインポート ライブラリの場所がどのように指定されているかわかりません。

import .libs が 32 ビットまたは 64 ビットとしてタグ付けされていることを dumpbin で確認しました。32 のインポート ライブラリで場所を指定しています。

あるマシンは機能し、別のマシンは機能しないため、問題はマシンの構成の 1 つにあると思います。したがって、マシン A から MS ツールを削除して再インストールしました。

  • アンインストールされた VS2010、Windows 8 SDK、.NET Framework 4.5、QT ライブラリ、および QtCreator。
  • 上記のすべてを次の順序で再インストールしました。

    1. VS2010
    2. VS2010 SP1
    3. .NET フレームワーク 4.5
    4. Windows 8 SDK
    5. Qt ライブラリ 4.8.4
    6. QtCreator 2.7.1

64 ビット DLL にリンクされた 32 ビット exe がまだ取得されています。

奇妙なリンクの原因は何ですか? または、64ビットDLLにリンクする必要があると考える理由をより正確に判断するにはどうすればよいですか?

4

1 に答える 1

1

そうではない。

質問文からの回答:

これは本質的にすべて偽物です。アプリケーションが実行されているマシンの Depends.exe のバージョンは 32 ビット バージョンであることが判明しました。それを修正すると、両方のマシンでシステム DLL が 64 ビットとして表示されるため、これは問題の原因ではありません。

最終的に、問題は 1 つの 64 ビット DLL でした。これは、正しいバージョンの Dependency Walker を使用した後、見つけやすくなりました。32 ビット バージョンと 64 ビット バージョンの選択は、実行しているプラ​​ットフォームに基づいていません。よくある質問から:

Dependency Walker は、32 ビットまたは 64 ビットの Windows モジュールで動作します。32 ビット バージョンと 64 ビット バージョンの Dependency Walker があります。すべてのバージョンは、32 ビットおよび 64 ビット モジュールに対応しているか、開くことができます。ただし、32 ビットの Dependency Walker を使用して 32 ビット モジュールを処理し、64 ビットの Dependency Walker を使用して 64 ビット モジュールを処理することには、大きな利点があります。これは、32 ビット プログラムと 64 ビット プログラムの両方を実行できる 64 ビット バージョンの Windows で実行している場合に特に当てはまります。64 ビット Windows 上の 32 ビット サブシステム ("WOW64" として知られています) には、独自のプライベート レジストリ、"AppPaths"、"KnownDlls"、システム フォルダー、およびマニフェスト処理があります。32 ビット モジュールを正確に処理するために必要なこの 32 ビット環境にアクセスできるのは、32 ビット バージョンの Dependency Walker だけです。同じく、

于 2014-04-23T21:12:33.933 に答える