【问题标题】:How to statically compile an SDL game on Windows如何在 Windows 上静态编译 SDL 游戏
【发布时间】:2010-09-12 01:30:54
【问题描述】:

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

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

【问题讨论】:

  • 我不想成为不完整的公认答案:(。如果您可以提供更多信息(例如 sdl-config 调用的输出和链接器错误列表),我'愿意尝试修正我的答案。
  • sdl --static-libs 返回: "-L/usr/local/lib -lmingw32 -lSDLmain -lSDL -mno-cygwin -mwindows" 这对我来说是正确的。我可以给你任何其他信息吗?

标签: windows sdl sdl-image sdl-mixer


【解决方案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 测试。

【讨论】:

  • 这里有来源:bar.cpp #undef UNICODE, #define UNICODE, #include , #include ,include ,Using namespace std; ,int wmain(int argc,wchar_t* argv[]),{ wostringstream 文本; text
  • main.cpp #include#include#include #include using namespace std; int main(int argc,char *argv[]) {SDL_Surface *screen;SDL_Event 事件; if(SDL_Init(SDL_INIT_VIDEO)==-1) {SDL_GetError());return 1;} MessageBox(0, TEXT("Pulsa el OK"),TEXT("Hola"), MB_SETFOREGROUND);而(SDL_WaitEvent 事件)){if(event.type==SDL_QUIT)中断; } SDL_Quit ( );返回 0;}
【解决方案2】:

在我的系统 (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 的完全静态的二进制文件是一个坏主意。脉冲、caca、aa 和 directfb 可能可以设为静态。我还没有弄清楚它们。

【讨论】:

    【解决方案3】:

    在编译项目时,您只需对 makefile 进行几处更改。

    • sdl-config --static-libs代替sdl-config --libs
    • -Wl,-Bstatic-Wl,-Bdynamic包围上述sdl-config --static-libs的使用。这告诉 GCC 强制静态链接,但仅限于它们之间指定的库。

    如果您的 makefile 当前看起来像:

    SDLLIBS=`sdl-config --libs`
    

    改成:

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

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

    【讨论】:

    • 我将此标记为答案,因为它似乎是最佳答案。然而,我仍然无法让它工作,因为我正在获得大量“未定义的引用”来调用 _waveOutOpen@24 或 _timeGetTime@0 等函数。
    • @Sec 这些是引入的要求,因为 SDL 静态库使用它们。 WInMM 多媒体库和其他一些可能必须添加到您的链接行。
    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

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

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

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

      【讨论】:

      • LGPL 是一个非常宽松的许可证,并且允许静态包含在闭源应用程序中。 GPL 不允许包含在封闭源应用程序中,除非包含 dll 类型。
      • afaik GPL 不允许与封闭源代码进行任何形式的链接。 LGPL 允许动态链接(用户必须能够更新/更改 LGPL 代码)。在闭源软件中与 LGPL 进行静态链接是不允许的。
      • 只要您为客户提供重新链接到 LGPL 库的功能(如果他们愿意),您就可以提供静态链接的二进制文件。您还必须包含 LGPL 并声明使用的库属于此许可。
      猜你喜欢
      • 1970-01-01
      • 2010-12-29
      • 2020-08-25
      • 1970-01-01
      • 1970-01-01
      • 2022-01-12
      • 1970-01-01
      • 1970-01-01
      • 2011-04-30
      相关资源
      最近更新 更多