Скомпилировал пару .dll с помощью Visual Studio 2015 и попытался развернуть на некоторых старых версиях Windows 7/64. Пытался также угадать, какие библиотеки необходимы для запуска приложения, и скопировал MSVCP140.DLL и VCRUNTIME140.DLL, но приложение не смогло загрузить DLL vs2015. Начал анализировать, что не так - и обходчик зависимостей показал зависимости от следующих dll:
API-MS-WIN-CRT-MATH-L1-1-0.DLL
API-MS-WIN-CRT-HEAP-L1-1-0.DLL
API-MS-WIN-CRT-CONVERT-L1-1-0.DLL
API-MS-WIN-CRT-STRING-L1-1-0.DLL
API-MS-WIN-CRT-STDIO-L1-1-0.DLL
API-MS-WIN-CRT-RUNTIME-L1-1-0.DLL
API-MS-WIN-CRT-FILESYSTEM-L1-1-0.DLL
API-MS-WIN-CRT-TIME-L1-1-0.DLL
Это было особенно удивительно, поскольку, насколько я понимаю, CRT отвечает за запуск dll / exe и не предоставляет никаких услуг более высокого уровня.
Ок, попробовал придумать, как от них избавиться или хотя бы свести к минимуму.
Нашла одну статью: https://blogs.msdn.microsoft.com/vcblog/2015/03/03/introduction-the-universal-crt/
В нем упоминается о выпускаемых статических библиотеках - поэтому я подумал, что могу связать их и избавиться от ада зависимостей * L1-1-0.DLL *, но, что бы я ни пробовал - у меня ничего не получилось. Я попытался связать libvcruntime.lib, libucrt.lib, libcmt.lib, попытался отключить использование параметра компоновщика "/nodefaultlib:vcruntime.lib" и даже попытался добавить каталог включения $ (UniversalCRT_IncludePath), а также переопределил некоторые of define, как я пытался догадаться, они работают - ни одна из моих попыток не помогла.
В качестве промежуточного решения я вернулся к использованию Visual Studio 2013, где DLL CRT всего две: msvcp120.dll, msvcr120.dll.
Конечно, вы, вероятно, порекомендуете установить среду выполнения Visual Studio 2015, но одно из наших требований - поддерживать автономный исполняемый файл, который работает без какой-либо установки, поэтому вопрос о дополнительной установке пока не обсуждается.
Можете ли вы порекомендовать мне что-нибудь еще, кроме как дождаться прибытия Visual Studio 2017?
crtdll.c
- это всего лишь небольшая часть CRT, он также включает в себя множество других вещей, таких как реализацияprintf
, как описано в статье Code Project, которую вы связали. Единственная разница в том, что теперь CRT разделен на отдельные библиотеки и DLL. Если вы почему они сделали это, вы можете попробовать прочитать запись блога MSDN, на которую вы указали ссылку в своем сообщении, вместе с записями блога, на которые она ссылается в начале. В качестве бонуса, если вы потратите время, чтобы прочитать его до конца, вы также найдете решение своей проблемы. - person Ross Ridge   schedule 05.03.2016