2016-06-13 32 views
2

スタティックリンクを使用してQtスタンドアロンアプリケーションを構築しています(this guide)。私は実行可能ファイルにマニフェストを埋め込むことからなる最後のものを除いて、各ステップに従いました。アプリケーションは多くのマシン上で正常に動作します。しかし、MSVCP140.dllがコンピュータに存在しないため、実行ファイルを起動できない場所が見つかりました。これは、おそらく私がマニフェストを含んでいないという事実によって引き起こされるエラーです。実際、上記のガイドに明確に書かれている:Qtスタンドアロンアプリケーションのマニフェストファイルを作成する方法

[...]あなたはこのようなアプリケーションがオンに開始されたときにMSVCP90.dllの欠落などのエラーを回避するために、アプリケーション内でマニフェストを埋め込むためにmt.exeを実行する必要があります他のコンピュータ

私の二つの質問

は以下のとおりです。

  1. この場合、マニフェストファイルの機能は何ですか?なぜなら、一部のマシンではアプリケーションがなくても、他のマシンでは必要なのはなぜですか?私が知っていることから、Visual Studioはテストに使用されたコンピュータのどれにもインストールされていません。
  2. Qtアプリケーション用のファイルを生成するにはどうすればよいですか?私はガイドの手順に従い、マニフェストファイルは自動的に生成されません。したがって、静的バージョンのQtをビルドしたときに何かを見逃していたか、それを行うために外部ツールを使うべきだと私は仮定しています。たとえば、私はMage.exeがマニフェストを生成するために使用できることを知っていましたが、私の場合は正しい方法であるかどうかはわかりません。
+1

依存関係が見つからないというエラーを防ぐには、アプリケーションの横にそれらの扶養家族を同封してください。 – IInspectable

+0

@IInspectable私がスタンドアロンとしてアプリケーションをビルドする理由は、実行可能ファイルのみを出荷できるようにするためです。依存度があまりないので、exeは依然として十分に小さく分散しています。 – lupod

答えて

2

DLLを再配布しない場合は、CRTをアプリケーションに静的にリンクする必要があります。もしあなたがそれをしていれば、あなたはDLLが見つからないというエラーを受け取ることはありません。あなたのアプリケーションは静的にリンクされているため、DLLを使用していません。

Qtライブラリへのリンクがであり、別のであることに注意してください。おそらくそれらを静的にリンクしていますが、静的にCRTをリンクするのを忘れてしまっています。

Visual Studioを使用している場合は、ここで適切なノブ見つける:
         プロジェクト→プロパティ→設定→ C/C++コード生成→ →ランタイムライブラリを。
配布するリリースビルドには、/MTに設定されていることを確認してください。マルチスレッドは、今日利用可能な唯一のオプションです。リリースビルドには「デバッグ」バージョンは不要で、静的にリンクしている場合はDLLバージョンを必要としません。 プロジェクトののすべてが同じオプション(ここではおよび)に設定されていることを確認してください。互換性の問題を避けるために、すべて同じバージョンのCRTを使用する必要があります。

異なるIDE /コンパイラツールセットを使用している場合、これらの設定を構成する方法については、そのドキュメントを参照する必要があります。あなたはその質問に特定のものは言及していません。

マニフェストについては、すべてのWindowsアプリケーションにマニフェストを含める必要があります。マニフェストに含まれる内容は、アプリケーションの処理内容とサポートしているWindowsの機能によって異なります。しかし、共通コントロールのバージョン6のサポートを示すことが99%の可能性があります。また、自分自身をUAC対応としてマークすることもできます。管理者権限を必要としない標準的なアプリケーションを作成している可能性が85%あるため、マニフェストでasInvokerと指定されます。 DPIの認識、Windowsのバージョンサポートなど、他のものもマニフェストに入ることができます。MSDN documentationには、詳細が含まれています。詳しくは、Application Manifestsのセクションを参照してください。

標準アプリケーション用のサンプルマニフェストは次のようになります。

<?xml version="1.0" encoding="UTF-8"?> 
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3" manifestVersion="1.0"> 

    <!-- Enable use of version 6 of the common controls (Win XP and later) --> 
    <dependency> 
    <dependentAssembly> 
     <assemblyIdentity type="win32" 
         name="Microsoft.Windows.Common-Controls" 
         version="6.0.0.0" 
         processorArchitecture="*" 
         publicKeyToken="6595b64144ccf1df" 
         language="*" /> 
    </dependentAssembly> 
    </dependency> 

    <!-- Indicate UAC compliance, with no need for elevated privileges (Win Vista and later) --> 
    <!-- (if you need enhanced privileges, set the level to "highestAvailable" or "requireAdministrator") --> 
    <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3"> 
    <security> 
     <requestedPrivileges> 
     <requestedExecutionLevel level="asInvoker" uiAccess="false" /> 
     </requestedPrivileges> 
    </security> 
    </trustInfo> 

    <!-- Indicate high API awareness (Win Vista and later) --> 
    <!-- (if you support per-monitor high DPI, set this to "True/PM") --> 
    <application xmlns="urn:schemas-microsoft-com:asm.v3"> 
    <windowsSettings> 
     <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware> 
    </windowsSettings> 
    </application> 

    <!-- Declare support for various versions of Windows --> 
    <ms_compatibility:compatibility xmlns:ms_compatibility="urn:schemas-microsoft-com:compatibility.v1" xmlns="urn:schemas-microsoft-com:compatibility.v1"> 
    <ms_compatibility:application> 
     <!-- Windows Vista/Server 2008 --> 
     <ms_compatibility:supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}" /> 
     <!-- Windows 7/Server 2008 R2 --> 
     <ms_compatibility:supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}" /> 
     <!-- Windows 8/Server 2012 --> 
     <ms_compatibility:supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}" /> 
     <!-- Windows 8.1/Server 2012 R2 --> 
     <ms_compatibility:supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}" /> 
     <!-- Windows 10 --> 
     <ms_compatibility:supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" /> 
    </ms_compatibility:application> 
    </ms_compatibility:compatibility> 

</assembly> 

マニフェストでは、SDKツールを使用して、アプリケーションのバイナリにリンクしていることを、マイクロソフト定義のXMLスキーマ以下、単純なテキストファイルであります。具体的にはmt.exeがこれを行い、マニフェストをバイナリにマージします。多くの場合、これはリンク時に行われます。マイクロソフトのリンカーが自動的にあなたのためにそれを行います。他のベンダーのリンカーについてはわかりません。ビルド後のステップとして、mt.exeに電話することができます。 Windows SDKをインストールしている限り、コンピュータにインストールされます。サンプル・コマンド:あなたがバイナリに署名している場合

mt.exe -manifest MyApp.exe.manifest -outputresource:MyApp.exe;#1 

、あなたがこのステップ(明らかに)ので、署名を無効、バイナリを変更して、マニフェストを埋め込む後に署名していることを確認してください。

関連する問題