SDL mingw 静态库链接错误
SDL mingw static lib linking errors
我正在尝试使用 Mingw w64 编译一个简单的 SDL 程序。这是我的代码:
test.c
#include "SDL2/SDL.h"
#include <stdio.h>
int main( int argc, char* args[] )
{
SDL_Window *window;
SDL_Init(SDL_INIT_VIDEO);
window = SDL_CreateWindow("SDL2 Window", 100, 100, 640, 480, 0);
if(window==NULL)
{
printf("Could not create window: %s\n", SDL_GetError());
return 1;
}
SDL_Delay(3000);
SDL_DestroyWindow(window);
SDL_Quit();
return 0;
}
这是我用来编译程序的命令:
g++ -o text.exe test.c -I./include -L./lib -lmingw32 -lSDL2main -lSDL2
但是当我编译程序时,我得到了数百个 linking 错误,如下所示:
./lib/libSDL2.a(SDL_wasapi_win32.o): In function `WASAPI_PlatformInit':
/Users/valve/release/SDL/SDL2-2.0.22-source/foo-x64/../src/audio/wasapi/SDL_wasapi_win32.c:255: undefined reference to `__imp_CoCreateInstance'
我在 SDL 官方网站 windows 开发库部分从第二个 link 下载库,并从以下目录中获取库:
SDL2-2.0.22\x86_64-w64-mingw32\lib
./lib的内容为:
libSDL2main.a
libSDL.a
这是什么问题,我该如何解决?
根据您的意图,您有两个选择:
如果您想动态地 link SDL2(这应该是您的默认操作),您需要将 libSDL2.dll.a
添加到您的库目录中。然后 libSDL2.a
将被忽略并可以被删除。它应该可以正常工作,不需要其他更改。
如果你想静态 link SDL2,你需要更多 linker 标志。 Libs.private
部分的 sdl2.pc
中列出了确切的标志。
从 SDL 2.0.22 开始,它们是:-Wl,--dynamicbase -Wl,--nxcompat -Wl,--high-entropy-va -lm -ldinput8 -ldxguid -ldxerr8 -luser32 -lgdi32 -lwinmm -limm32 -lole32 -loleaut32 -lshell32 -lsetupapi -lversion -luuid
。
这些应该添加到 -lmingw32 -lSDL2main -lSDL2
的右边。
您可能还想将 -static
添加到静态 link 所有内容,包括标准库。 (当您的程序仍然需要标准库的 DLL 才能工作时,静态 linking SDL2 有什么意义?)这也使得 linker 更喜欢 libSDL2.a
而不是 libSDL2.dll.a
如果两者都可用,则意味着您无需担心库目录中的内容。
我正在尝试使用 Mingw w64 编译一个简单的 SDL 程序。这是我的代码:
test.c
#include "SDL2/SDL.h"
#include <stdio.h>
int main( int argc, char* args[] )
{
SDL_Window *window;
SDL_Init(SDL_INIT_VIDEO);
window = SDL_CreateWindow("SDL2 Window", 100, 100, 640, 480, 0);
if(window==NULL)
{
printf("Could not create window: %s\n", SDL_GetError());
return 1;
}
SDL_Delay(3000);
SDL_DestroyWindow(window);
SDL_Quit();
return 0;
}
这是我用来编译程序的命令:
g++ -o text.exe test.c -I./include -L./lib -lmingw32 -lSDL2main -lSDL2
但是当我编译程序时,我得到了数百个 linking 错误,如下所示:
./lib/libSDL2.a(SDL_wasapi_win32.o): In function `WASAPI_PlatformInit':
/Users/valve/release/SDL/SDL2-2.0.22-source/foo-x64/../src/audio/wasapi/SDL_wasapi_win32.c:255: undefined reference to `__imp_CoCreateInstance'
我在 SDL 官方网站 windows 开发库部分从第二个 link 下载库,并从以下目录中获取库:
SDL2-2.0.22\x86_64-w64-mingw32\lib
./lib的内容为:
libSDL2main.a
libSDL.a
这是什么问题,我该如何解决?
根据您的意图,您有两个选择:
如果您想动态地 link SDL2(这应该是您的默认操作),您需要将
libSDL2.dll.a
添加到您的库目录中。然后libSDL2.a
将被忽略并可以被删除。它应该可以正常工作,不需要其他更改。如果你想静态 link SDL2,你需要更多 linker 标志。
Libs.private
部分的sdl2.pc
中列出了确切的标志。从 SDL 2.0.22 开始,它们是:
-Wl,--dynamicbase -Wl,--nxcompat -Wl,--high-entropy-va -lm -ldinput8 -ldxguid -ldxerr8 -luser32 -lgdi32 -lwinmm -limm32 -lole32 -loleaut32 -lshell32 -lsetupapi -lversion -luuid
。这些应该添加到
-lmingw32 -lSDL2main -lSDL2
的右边。您可能还想将
-static
添加到静态 link 所有内容,包括标准库。 (当您的程序仍然需要标准库的 DLL 才能工作时,静态 linking SDL2 有什么意义?)这也使得 linker 更喜欢libSDL2.a
而不是libSDL2.dll.a
如果两者都可用,则意味着您无需担心库目录中的内容。