2016-07-22 57 views
0

我没有得到MinGW的g ++来成功编译SDL程序。这里是我的示例程序:使用MinGW和SDL无法链接:未定义引用WinMain @ 16

#include <SDL.h> 

int main(int argc, char* args[]) 
{ 
    SDL_Init(SDL_INIT_VIDEO); 
    SDL_Quit(); 
    return 0; 
} 

这是我的命令和错误报告:

C:\Users\briggs_w\Desktop\testSDL>g++ test.cc -IC:\MinGW\include\SDL 
-LC:\MinGW\lib -lSDL2 -lSDL2main -lmingw32 

C:\MinGW\lib/libmingw32.a(main.o):(.text.startup+0xa0): undefined reference to `[email protected]' 
collect2.exe: error: ld returned 1 exit status 

我复制一切SDL2的lib\x64i686-w64-mingw32\lib文件夹复制到文件夹C:\MinGW\lib

什么是缺失?也许在命令行。

我过目两个线程上类似的错误:

Undefined reference to [email protected] when using SDL - 这样

undefined reference to [email protected] C++, SDL-2 - 不影响

+0

'-lmingw32 -lSDL2main -lSDL2',正好按照这个顺序(当然还有libs之前的所有src/obj)。 – keltar

+0

这很好。我会接受它作为答案。 –

回答

0

我编译你的代码,使编译器和连接器选项被sdl2-config提供(包括在msys2包):

gcc -O -Wall test.cpp `sdl2-config --cflags --libs` 

$ SDL2-配置--cflags

-I/mingw64 /包含/ SDL2 -Dmain = SDL_main

$ SDL2-配置--libs

-L/mingw64/lib中-lmingw32 -lSDL2main - lSDL2 -mwindows

所以至少-lmingw32是在图书馆的其他位置进行链接也-Dmain=SDL_main失踪。库SDL2main是一个静态库,所以在链接时需要mingw32先于它。

SDL FAQ for windows

您应该使用的main()代替的WinMain(),即使你是 创建一个Windows应用程序,因为SDL提供了一个版本 的WinMain(的),它之前要进行一些SDL初始化打电话给你 的主要代码。如果由于某种原因需要使用WinMain(),请在src/main/win32/SDL_main.c的SDL源代码中查看 ,以了解在WinMain()函数中需要做什么类型的初始化操作,以便 SDL正常工作。

如果有类似SDL2-配置提供任何库的情况下,我想至少检查它所输出。

+0

如果是这种情况,那么会出现'未定义的SDL_main引用',但事实并非如此。 – keltar

+0

@keltar我的猜测是'-mwindows'将'main'翻译为'WinMain',然后SDL2main库中的'WinMain'作为重复被丢弃,并且不会被引用,因此SDL_main不会被引用。 –

+0

不,libmingw32.a引用WinMain,并且找不到一个。ld连接器对库命令很敏感,特别是当库是静态的时候。你的订单是正确的,所以它链接;有问题的订单不是。 – keltar

相关问题