如何在Windows上静态编译SDL游戏

时间:2020-03-06 14:32:54  来源:igfitidea点击:

我一直在尝试为Windows创建静态链接的"单二进制"版本的游戏。我想链接sdl,sdl_image和sdl_mixer,这反过来又引入了一些支持库。不幸的是,我还没有找到一种使用cygwin / mingw / gcc进行编译和链接的方法。据我所知,所有现有的公共版本仅是共享库/ dll。

请注意,我在这里不是在谈论许可。源将是开放的,因此sdl的GPL / LGPLness不相关。

解决方案

这是因为SDL库受LGPL许可。

如果要静态链接库(如果重新编译它们,则可以这样做。尽管它需要对makefile进行一些修改),我们也必须将游戏置于兼容的开源许可证下。

SDL库作为共享库提供,因为使用它们的大多数程序都是封闭源。二进制分发以大多数人需要的形式出现。

通过此SDL邮件列表帖子,看来sdl开发工具附带了sdl-config脚本,我们可以将其与--static-libs标志一起使用,以确定需要使用哪些链接器标志。

编译项目时,我们只需要对makefile进行几处更改。

  • 代替sdl-config --libs,使用sdl-config --static-libs
  • 将上述sdl-config --static-libs-Wl,-Bstatic-Wl,-Bdynamic一起使用。这告诉GCC强制进行静态链接,但仅针对它们之间指定的库。

如果makefile当前如下所示:

SDLLIBS=`sdl-config --libs`

更改为:

SDLLIBS=-Wl,-Bstatic `sdl-config --static-libs` -Wl,-Bdynamic

这些实际上是我们在类似Unix的系统上应该做的相同的事情,但是,如果我们对GCC使用更简单的-static标志,就像在Windows上一样,通常不会在Unix上导致那么多错误。

在我的系统(Ubuntu)上,我必须使用以下标志:

-Wl,Bstatic -lSDL_image `sdl-config --libs` -lpng12 -lz -ltiff -ljpeg -lasound -laudio -lesd -Wl,-Bdynamic `directfb-config --libs` -lpulse-simple -lcaca -laa -ldl

它将SDL,SDL__image及其许多依赖项链接为静态链接。 libdl永远不需要静态,因此制作一个使用SDL_image的全静态二进制文件是一个糟糕的主意。可以将pulse,caca,aa和directfb设为静态。我还没有足够的能力来解决它们。