17

我一直在尝试为我的 Windows 游戏制作一个静态链接的“单一二进制”版本。我想与 sdl、sdl_image 和 sdl_mixer 链接,它们反过来又引入了一些支持库。不幸的是,我还没有找到一种方法让它们全部使用 cygwin/mingw/gcc 进行编译和链接。据我所知,所有现有的公共版本都只是共享库/dll。

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

4

5 回答 5

22

编译项目时,您只需对 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 系统上做的同样的事情,但是如果你在-staticGCC 上使用更简单的标志,它通常不会在类 Unix 系统上导致那么多错误,就像在 Windows 上那样。

于 2009-02-08T03:52:49.217 回答
2

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

于 2009-02-04T15:45:56.973 回答
1

环境: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 测试。

于 2014-05-10T20:00:43.593 回答
0

这是因为 SDL 库在 LGPL 许可下。

如果你想静态链接库(如果你重新编译它们,你可以这样做。不过它需要对 makefile 进行一些黑客攻击),你还必须将你的游戏置于一些兼容的开源许可证下。

SDL-lib 以共享库的形式出现,因为大多数使用它们的程序都是封闭源代码。二进制发行版以大多数人需要的形式出现。

于 2008-09-22T16:20:43.067 回答
0

在我的系统(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 可能可以设为静态。我还没有足够远去弄清楚它们。

于 2009-09-12T23:20:14.870 回答