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 如果两者都可用,则意味着您无需担心库目录中的内容。