2016-06-13 3 views
2

Я создаю автономное приложение Qt со статической связью после this guide. Я следил за каждым шагом, за исключением последнего, который состоит из встраивания манифеста в исполняемый файл, и приложение отлично работает на нескольких машинах; Однако я нашел тот, где исполняемый файл не может быть запущен, поскольку MSVCP140.dll отсутствует на компьютере. Это ошибка, скорее всего, вызвана тем, что я не включил манифест. Действительно, в руководстве над ней ясно написано:Как создать файл манифеста для автономного приложения Qt

[...] вы должны выполнить mt.exe, чтобы встроить манифест внутри приложения, чтобы избежать ошибок, таких как отсутствие MSVCP90.dll, когда приложение запускается на другие компьютеры

Мои два вопроса:

  1. Какова функция файла манифеста в этом случае? Почему на некоторых машинах приложение работает без него, а для других - это нужно? Из того, что я знаю, Visual Studio установлен ни на одном из компьютеров, которые были использованы для теста.
  2. Как создать такой файл для моего приложения Qt? Я выполнил шаги руководства, и файл манифеста автоматически генерируется. Следовательно, я предполагаю, что либо я что-то пропустил, когда я построил статическую версию Qt, либо я должен использовать какой-то внешний инструмент для этого. Например, я видел, что Mage.exe может использоваться для генерации манифестов, но я не знаю, правильно ли это в моем случае.
+1

Чтобы предотвратить ошибку в отношении отсутствующих зависимостей, отправьте эти иждивенцы вместе с приложением. – IInspectable

+0

@ IInpectable Причина, по которой я создаю приложение как автономное, заключается в том, что я хотел бы иметь возможность отправлять только исполняемый файл. Поскольку не так много зависимостей, exe все еще остается достаточно малым, чтобы его можно было легко распределить. – lupod

ответ

2

Если вы не хотите распространять библиотеки DLL, вам необходимо статически связать CRT с приложением. Если бы вы это сделали, вы не получили бы ошибок в отношении DLL. Ваше приложение не будет использовать DLL, потому что оно статически связано.

Обратите внимание, что это отдельный от ссылки на библиотеки Qt. Вы, вероятно, связываете их статически, но забыли связать ЭЛТ статически.

Если вы используете Visual Studio, вы найдете соответствующую ручку здесь:
          Проект → → Свойства конфигурации → C/C++ → Генерация кода → Runtime библиотеки.
Для выпусков, которые вы будете распространять, убедитесь, что он установлен в /MT. В настоящее время доступно многопоточное средство. Вы не хотите «отлаживать» версию для выпусков, и вам не нужна версия DLL, если вы статически связываетесь. Удостоверьтесь, что все ваших проектов имеют ту же самую опцию, , а также любые другие статические библиотеки, на которые вы ссылаетесь. Для предотвращения проблем совместимости необходимо использовать одну и ту же версию ЭЛТ.

Если вы используете другой набор инструментов IDE/компилятора, вам необходимо ознакомиться с его документацией, чтобы узнать, как настроить эти параметры. Вы не упоминаете конкретного вопроса.

Что касается манифеста, да, все приложения Windows должны включать манифест. То, что принадлежит вашему манифесту, зависит от того, что делает ваше приложение, и от того, какие функции Windows вы поддерживаете. Но есть 99% вероятность того, что вы хотите указать поддержку версии 6 общих элементов управления. Вы также захотите отметить себя как 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> 

Манифест представляет собой простой текстовый файл, после Microsoft определенной схемы XML, что вы ссылаетесь в двоичных, с помощью SDK инструментов вашего приложения , В частности, mt.exe делает это для вас, сливая манифест в двоичный файл. Часто это делается во время соединения. Компонент Microsoft сделает это автоматически. Я не уверен в линкерах других поставщиков. Вы можете позвонить по телефону mt.exe, чтобы сделать это для вас как шаг после сборки. Он будет находиться на вашем компьютере, если вы установили Windows SDK. Образец команды:

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

Если вы подписываете ваш бинарный файл, убедитесь, что вы подписываете после встраивание манифеста, так как этот шаг (очевидно) изменяет двоичный файл, таким образом недействительности подписи.

Смежные вопросы