Не удается создать полное статически связанное приложение

Я пытался более 15 часов подряд найти способ статической компиляции моей игры Native C++ таким образом, чтобы она не требовала некоторых DLL (которые, как я полагаю, связаны с CRT).

Пользователи, загружающие мою игру, жалуются на отсутствие нескольких DLL, таких как:

VCRUNTIME140.dll
api-ms-win-core-timezone-l1-1-0.dll
api-ms-win-core-timezone-l2-1-0.dll
api-ms-win-core-processthreads-l1-1-1.dll
(and the list goes on)

Моя текущая командная строка для сборки:

/MP /GS /GL /analyze- /W3 /Gy /Zc:wchar_t /Zi /Gm- /O2 /sdl
/Fd"Release\vc140.pdb" /Zc:inline /fp:precise /D "WIN32"
/D "_CRT_SECURE_NO_WARNINGS" /D "_WIN32_WINNT=0x0501" /D "BOT_PROTECTION"
/D "CLIENT" /D "FW_GRAPHICS" /D "FW_NET" /D "FW_XML"
/D "NDEBUG" /D "_MBCS" /errorReport:prompt /WX- /Zc:forScope /Gd /Oy- /Oi /MT
/Fa"Release\" /EHsc /nologo
/Fo"Release\\Win32\src\%(RelativeDir)\" /Fp"Release\otclient.pch" 

Какие-нибудь мысли?


person Alexandre Severino    schedule 26.07.2017    source источник
comment
Есть ли какая-либо причина избегать DLL, кроме предпочтения?   -  person tadman    schedule 26.07.2017
comment
Это предпочтение. Но если я смогу сократить его примерно до 2 или 3 файлов DLL, я не буду возражать. Я действительно не хочу, чтобы пользователи (которые не заинтересованы в расследовании и хотят только щелкнуть и поиграть) разархивировали папку, полную DLL-файлов, и должны были искать EXE-файл.   -  person Alexandre Severino    schedule 26.07.2017
comment
Это не всегда возможно, по крайней мере, без использования вашего компоновщика. Динамические библиотеки не предназначены для жесткой привязки к вашей программе. Вот некоторое объяснение. Что вы можете сделать, так это запечь их в свой файл .exe, а затем выполнить некоторые хакерские действия, чтобы извлечь их из него во время выполнения. В наши дни это также очень схематично доставлять как единственное число .exe. Дайте людям установщик, который помещает вещи в нужное место, создает элементы меню «Пуск» и регистрирует их для удаления.   -  person tadman    schedule 26.07.2017
comment
Я могу только согласиться с @tadman. Установщик - это чистый путь.   -  person OutOfBound    schedule 26.07.2017


Ответы (1)


/MT действительно указывает компилятору связать CRT с вашим исполняемым файлом. Однако этого недостаточно, если другая DLL по-прежнему зависит от VCRUNTIME140.DLL. DLL могут зависеть от других DLL, даже циклически. Windows просто загружает их в том порядке, в котором они встречаются, если они еще не загружены. Поэтому, если TEST.EXE зависит от A.DLL, Windows загружает A.DLL. Если A.DLL зависит от B.DLL, Windows загружает B.DLL. Если B.DLL зависит от A.DLL, она уже загружена.

Далее, api-ms-... — это новые библиотеки DLL для Windows. Они реализуют старые Kernel32.DLL и подобные библиотеки DLL. Они не будут вызывать зависимость от VCRUNTIME140.DLL. Непонятно, как вы в конечном итоге зависите от них.

Тогда есть другие DLL, которые вы не перечисляете. Один из них должен быть причиной проблем, которые вы видите.

person MSalters    schedule 26.07.2017
comment
Мне действительно не нравится объяснять своим пользователям, почему они должны хранить гигантский набор DLL API-ms только для того, чтобы они могли запускать простое графическое приложение. Я решил свою проблему, скомпилировав свой код с помощью GCC Mingw. Жалоб на отсутствующие DLL пока нет. - person Alexandre Severino; 26.07.2017