Нереально: Диагностика, почему Windows не может загрузить DLL

#windows #dll #unreal-engine4

Вопрос:

Я пытаюсь настроить сервер непрерывной интеграции на базе Windows Server для полной сборки и упаковки проекта Unreal Engine 4. Подавляющее большинство процессов работает, но на этапе подготовки контента я постоянно сталкиваюсь со следующими ошибками:

 ********** COOK COMMAND STARTED **********
Running UE4Editor Cook for project C:workspaceCEIT_ingame-native-plugins_PR-44sampleProjectsunrealShooterGame26ShooterGame.uproject
Commandlet log file is C:Unreal426WindowsEngineProgramsAutomationToolSavedCook-2021.07.05-13.56.23.txt
Running: C:Unreal426WindowsEngineBinariesWin64UE4Editor-Cmd.exe C:workspaceCEIT_ingame-native-plugins_PR-44sampleProjectsunrealShooterGame26ShooterGame.uproject -run=Cook  -TargetPlatform=WindowsClient -fileopenlog -ddc=DerivedDataBackendGraph -unversioned -abslog=C:Unreal426WindowsEngineProgramsAutomationToolSavedCook-2021.07.05-13.56.23.txt -stdout -CrashForUAT -unattended -NoLogTimes  -UTF8Output
  LogInit: Display: Running engine for game: ShooterGame
  LogModuleManager: Warning: ModuleManager: Unable to load module 'C:/Unreal426/Windows/Engine/Binaries/Win64/UE4Editor-OpenGLDrv.dll' because the file couldn't be loaded by the OS.
  LogModuleManager: Warning: ModuleManager: Unable to load module 'C:/Unreal426/Windows/Engine/Plugins/Lumin/MagicLeap/Binaries/Win64/UE4Editor-MagicLeap.dll' because the file couldn't be loaded by the OS.
Took 14.257796s to run UE4Editor-Cmd.exe, ExitCode=1
ERROR: Cook failed.
       (see C:UsersjenkinsAppDataRoamingUnreal EngineAutomationToolLogsC Unreal426 WindowsLog.txt for full exception trace)
AutomationTool exiting with ExitCode=25 (Error_UnknownCookFailure)
BUILD FAILED
 

В частности, UE4Editor-OpenGLDrv.dll и UE4Editor-MagicLeap.dll не может быть загружен, но нет никаких четких указаний на то, почему это так, просто «файл не может быть загружен операционной системой». Файлы журналов, записанные на диск, сообщают мне не намного больше, чем приведенная выше информация. Я проверил, что обе библиотеки DLL действительно присутствуют на сервере CI, поэтому я подозреваю, что отсутствует какая-то другая зависимость.

Я попытался запустить зависимости от нереального исполняемого файла и библиотек DLL, упомянутых в журналах, чтобы определить, какие библиотеки DLL могут отсутствовать на самой серверной машине, но для завершения работы требуется более трех часов, поэтому повторное выполнение немного неудобно и отнимает много времени. Я последовал совету относительно отсутствующих зависимостей с этой страницы и просмотрел все вероятные библиотеки DLL, которые, как сообщалось, не были найдены утилитой зависимостей (в основном связанные с DirectX/OpenGL), но сборка по-прежнему завершается неудачно, и у меня заканчиваются идеи.

Есть ли в Windows какой-нибудь простой способ точно определить, почему DLL не загружается? Кажется, я помню, что сообщения об ошибках загрузки DLL Windows далеко не так информативны, как в Linux, но, возможно, есть инструмент или более простой метод для его решения, с которым я не знаком.


Редактировать: я сузил вещи вниз немного — если я пытаюсь загрузить glu32.dll динамически в программе моего собственного, я получаю сообщение об ошибке загрузки Could not load C:WindowsSystem32glu32.dll: The specified procedure could not be found. как это на нагрузку попытка, а не попытка взглянуть вверх функция, это означает, что некоторые процедуры отсутствует на суб-зависимостей glu32.dll , но я не знаю, как я бы идти о выявлении, какая она есть.

Комментарии:

1. Согласно исходному коду, вы можете запустить командную строку с-dllerrors, и это откроет окно с ошибкой. См. раздел FWindowsPlatformProcess::GetDllHandle.

2. Ах, это звучит как хороший крик. Я попробую и посмотрю.

3. К сожалению, похоже, что dllerrors не влияет на вывод программы сборки.

4. Может ли это быть несоответствие 32 бит 64 бит? Результат совсем не ясен. Он должен содержать основную ошибку Win (код).

5. Единственный код выхода , который я получаю, — это 1 , хотя это было FFFFFFFFC0000135 до того, как я добавил некоторые библиотеки DLL на сервер CI, которые присутствовали на моем настольном компьютере. Я убедился, что скопировал как 32-разрядные, так и 64-разрядные библиотеки DLL на сервер.

Ответ №1:

Вы можете попытаться удалить ядро/промежуточное звено и нажать GenerateProjectFiles.bat, чтобы восстановить весь проект.Если вы используете исходный код UE для запуска, см. Документацию UE и перестроение с помощью Visual Studio. Если вы используете редактор UE4 для запуска отсутствующей библиотеки dll, просто добавьте зависимость в свой проект.build.cs, как третья сторона, см. Документ UE.