如何在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设为静态。我还没有足够的能力来解决它们。