【发布时间】:2020-08-04 18:51:48
【问题描述】:
我正在尝试使用 MinGW-w64 在 Windows 10 上设置 SDL2 和 C 开发环境。
当尝试使用 SDL 初始化运行基本的 c 应用程序时,它编译时没有警告,但之后运行失败,再次没有任何警告。可执行文件刚刚退出。
来源:
#include<SDL2/SDL.h>
int main(int argc, char* argv[]) {
puts("\nmain...\n");
if (SDL_Init(SDL_INIT_VIDEO) < 0) {
printf("\nInit error: %s\n", SDL_GetError());
}
else {
puts("\nSDL init success...");
}
}
... 和生成文件:
OBJS = sdl_init.c
EXE_NAME = sdl_init_test
CFLAGS_W = -w -Wl,-subsystem,windows
LFLAGS_W = -lmingw32 -lSDL2main -lSDL2
INCS_W = -IC:\MinGW\devlibs\SDL2-2.0.12\x86_64-w64-mingw32\include
LIBS_W = -LC:\MinGW\devlibs\SDL2-2.0.12\x86_64-w64-mingw32\lib
windows_debug:
gcc $(OBJS) $(INCS_W) $(LIBS_W) $(CFLAGS_W) $(LFLAGS_W) -g -o $(EXE_NAME).exe
...以及来自 gdb 的奇怪输出:
Reading symbols from .\sdl_init_test.exe...
(gdb) list main
12 ../../src/mingw-w64-crt/crt/crt0_c.c: No such file or directory.
(gdb) b main
Breakpoint 1 at 0x402e70: file ../../src/mingw-w64-crt/crt/crt0_c.c, line 17.
我假设我在链接阶段做错了什么,但无法准确指出。 在 Linux 上,一切都按预期编译、运行和调试。
这是一个更正后的 makefile,如 answered,它将在 Windows 控制台中编译并正常工作:
SRC = sdl_init.c
EXE_NAME = sdl_init_test
CFLAGS_W = -Wall -Wl,-subsystem,console
LFLAGS_W = -lmingw32 -lSDL2main -lSDL2
INCS_W = -IC:\MinGW\devlibs\SDL2-2.0.12\x86_64-w64-mingw32\include
LIBS_W = -LC:\MinGW\devlibs\SDL2-2.0.12\x86_64-w64-mingw32\lib
windows_debug:
gcc $(SRC) $(INCS_W) $(LIBS_W) $(CFLAGS_W) $(LFLAGS_W) -g -o $(EXE_NAME).exe
【问题讨论】:
-
运行时会发生什么,什么都没有?如果是,你如何运行它,从终端还是从资源管理器?如果来自终端,请尝试从资源管理器中进行。
-
它在你的调试器中能走多远?
-
您可能没有将所有 sdl DLL 文件放在可执行文件旁边。
-
我从终端运行它,现在从资源管理器尝试它 - 它给了我
Application Error: The application was unable to start correctly (0xc000007b). Click OK to close the application.快速搜索显示它是 Windows 中相当通用的错误消息... -
而且,gdb 并没有真正让我到任何地方。无论我做什么,它都只是引用 crt0_c.c。
(gdb) run Starting program: **************\sdl_init_test.exe [New Thread 2332.0x3870] [New Thread 2332.0x4744] [New Thread 2332.0x24c8] [Thread 2332.0x24c8 exited with code 3221225595] [Thread 2332.0x3870 exited with code 3221225595] [Thread 2332.0x26ac exited with code 3221225595] During startup program exited with code 0xc000007b.