Диагностика проблем DLL с SDL2 и MinGW
Я пытаюсь получить простое приложение SDL2, которое я написал и запускаю, но, похоже, проблема с SDL2 на моем компьютере. Я использую 64-разрядную версию Windows 8.1 Pro со всеми установленными библиотеками MS Visual Studio C++ 2013 (x64 и x86) и полностью обновленной Windows. SDL2 отлично работал на моем старом компьютере с аналогичной настройкой (я недавно переустанавливал Windows), поэтому я не могу объяснить эту ошибку.
TL; DR: простой тестовый код, который я написал, терпит неудачу при загрузке DLL из C:\Windows\System32. Как я могу диагностировать проблемы с загрузкой DLL в Windows?
Тестовый код
#include "SDL.h"
int main(int argc, char* argv[])
{
SDL_Init(SDL_INIT_EVERYTHING);
SDL_Quit();
return 0;
}
Makefile
LIBRARY_PATHS=-LC:\MinGW\SDL2-2.0.3\i686-w64-mingw32\lib
LIBRARY_INC=-IC:\MinGW\SDL2-2.0.3\i686-w64-mingw32\include\SDL2
CXX = mingw32-g++
CXXFLAGS=-g
LIBRARY_FLAGS=-lmingw32 -lSDL2main -lSDL2 -mwindows
main.exe: main.cpp
$(CC) $(LIBRARY_PATHS) $(LIBRARY_INC) -o main.exe main.cpp $(LIBRARY_FLAGS)
clean:
rm main.exe
Компиляция и запуск
D:\Projects\sdl-test
$ mingw32-make
cc -LC:\MinGW\SDL2-2.0.3\i686-w64-mingw32\lib -IC:\MinGW\SDL2-2.0.3\i686-w64-mingw32\include\SDL2 -o main.exe main.cpp -lmingw32 -lSDL2main -lSDL2
D:\Projects\sdl-test
? gdb .\main.exe
GNU gdb (GDB) 7.6.1
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "mingw32".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from D:\Projects\sdl-test\main.exe...done.
(gdb) run
Starting program: D:\Projects\sdl-test/.\main.exe
[New Thread 3136.0xae4]
warning: SHIMVIEW: ShimInfo(Complete)
gdb: unknown target exception 0xc000007b at 0x7758d4f2
During startup program exited with code 0xc000007b.
(gdb) quit
После долгих поисков я выяснил, что указанный код ошибки (0xc000007b) связан с загрузкой DLL, поэтому я проверил Просмотр событий:
Журналы событий
Event Viewer:
Faulting application name: main.exe, version: 0.0.0.0, time stamp: 0x02d2e568
Faulting module name: ntdll.dll, version: 6.3.9600.17736, time stamp: 0x550f42c2
Exception code: 0xc000007b
Fault offset: 0x0009d4f2
Faulting process id: 0xc40
Faulting application start time: 0x01d0a1729dcec24e
Faulting application path: D:\Projects\sdl-test\main.exe
Faulting module path: C:\Windows\SYSTEM32\ntdll.dll
Report Id: db8737d8-0d65-11e5-8268-c4d987e72ee3
Faulting package full name:
Faulting package-relative application ID:
Из другого журнала:
Windows cannot access the file for one of the following reasons: there is a problem with the network connection, the disk that the file is stored on, or the storage drivers installed on this computer; or the disk is missing. Windows closed the program main.exe because of this error.
Program: main.exe
File:
The error value is listed in the Additional Data section.
User Action
1. Open the file again. This situation might be a temporary problem that corrects itself when the program runs again.
2. If the file still cannot be accessed and
- It is on the network, your network administrator should verify that there is not a problem with the network and that the server can be contacted.
- It is on a removable disk, for example, a floppy disk or CD-ROM, verify that the disk is fully inserted into the computer.
3. Check and repair the file system by running CHKDSK. To run CHKDSK, click Start, click Run, type CMD, and then click OK. At the command prompt, type CHKDSK /F, and then press ENTER.
4. If the problem persists, restore the file from a backup copy.
5. Determine whether other files on the same disk can be opened. If not, the disk might be damaged. If it is a hard disk, contact your administrator or computer hardware vendor for further assistance.
Additional Data
Error value: 00000000
Disk type: 0
ntdll.dll - то, где я потерял след; Я не могу понять, почему моя программа падает при загрузке этой DLL. Такие программы, как ProcMon и DependencyWalker, не смогли мне ничего сказать, и я не могу найти официальную документацию Microsoft о том, что делает ntdll.dll или как это исправить.
2 ответа
Понял! По некоторым причинам, в том числе SDL2.dll, SDL2_image.dll и SDL2_ttf.dll в той же папке, что и запущенное приложение, недостаточно. Я думаю, что Windows до сих пор не может их найти. Я должен был скопировать содержимое SDL2-2.0.3\i686-w64-mingw32\bin в C: \ Windows \ System32.
Я думаю, что есть лучший способ сделать это; заполнение вашего windir случайными DLL-файлами звучит как отличный способ что-то испортить в будущем, но пока это работает.
Удивительно, что помещение SDL2 в ту же директорию, что и main.exe, не работает.
Поместите dll SDL2 в тот же каталог, что и ваш.exe, или добавьте каталог, в котором SDL2 находится в PATH, или для MingW вы можете установить LIBRARY_PATH в каталог, содержащий dll.