Если вы не хотите распространять библиотеки 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
Если вы подписываете ваш бинарный файл, убедитесь, что вы подписываете после встраивание манифеста, так как этот шаг (очевидно) изменяет двоичный файл, таким образом недействительности подписи.
Чтобы предотвратить ошибку в отношении отсутствующих зависимостей, отправьте эти иждивенцы вместе с приложением. – IInspectable
@ IInpectable Причина, по которой я создаю приложение как автономное, заключается в том, что я хотел бы иметь возможность отправлять только исполняемый файл. Поскольку не так много зависимостей, exe все еще остается достаточно малым, чтобы его можно было легко распределить. – lupod