我一直在尝试为我的 Windows 游戏制作一个静态链接的“单一二进制”版本。我想与 sdl、sdl_image 和 sdl_mixer 链接,它们反过来又引入了一些支持库。不幸的是,我还没有找到一种方法让它们全部使用 cygwin/mingw/gcc 进行编译和链接。据我所知,所有现有的公共版本都只是共享库/dll。
请注意,我在这里不是在谈论许可。源将是开放的,因此 sdl 的 GPL/LGPL 不相关。
编译项目时,您只需对 makefile 进行一些更改。
sdl-config --libs
,使用sdl-config --static-libs
sdl-config --static-libs
使用。这告诉 GCC 强制静态链接,但仅限于它们之间指定的库。-Wl,-Bstatic
-Wl,-Bdynamic
如果您的 makefile 当前看起来像:
SDLLIBS=`sdl-config --libs`
将其更改为:
SDLLIBS=-Wl,-Bstatic `sdl-config --static-libs` -Wl,-Bdynamic
这些实际上是你应该在类 Unix 系统上做的同样的事情,但是如果你在-static
GCC 上使用更简单的标志,它通常不会在类 Unix 系统上导致那么多错误,就像在 Windows 上那样。
通过这个SDL 邮件列表帖子,似乎 sdl 开发工具附带了一个 sdl-config 脚本,您可以将其与 --static-libs 标志一起使用来确定您需要使用哪些链接器标志。
环境:VMWare Virtual Machine with Windows 7 x64 and Equipment we Dev c++ build 7.4.2.569, complilador g++ (tdm-1) 4.6.1
曾经,作为配置 Dev c ++ 安装的 SDL2-2.0.3 API 不是很清楚我做了什么,因为传统需要命令行。
第一个问题是 Windows 7 似乎改变了方法,他们去他的球。存货。参考。https://stackoverflow.com/users/464581/cheers-and-hth-alf
在第一关之后,SDL_platform.h 很糟糕,它又下降了一个,我不记得我在哪里下载了,但是下一个在指示的版本中不起作用。
我们必须将 SDL2.h ls 放在可执行文件的目录中。
D:\prg_desa\zsdl2>g++ bar.cpp main.cpp -o pepe1 -ID:\SDL2-2.0.3\i686-w64-mingw32\include\SDL2 -LD:\SDL2-2.0.3\i686-w64-mingw32\lib -lmingw32 -lSDL2main -lSDL2 -mwindow
我终于编译并进行了 SDL2 测试。
这是因为 SDL 库在 LGPL 许可下。
如果你想静态链接库(如果你重新编译它们,你可以这样做。不过它需要对 makefile 进行一些黑客攻击),你还必须将你的游戏置于一些兼容的开源许可证下。
SDL-lib 以共享库的形式出现,因为大多数使用它们的程序都是封闭源代码。二进制发行版以大多数人需要的形式出现。
在我的系统(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_
映像和它们的许多依赖项作为静态链接。libdl 你永远不需要静态的,所以制作一个使用 SDL_
图像的完全静态的二进制文件是一个坏主意。脉冲、caca、aa 和 directfb 可能可以设为静态。我还没有足够远去弄清楚它们。