我一直在尝试为Windows制作一个静态链接的“单二进制”版本的游戏。我想链接sdl,sdl_image和sdl_mixer,这反过来又引入了一些支持库。不幸的是我还没有找到一种方法来使用cygwin / mingw / gcc来编译和链接。据我所知,所有现有的公共版本只是共享库/ dll。
请注意,我不是在谈论许可。源将是开放的,因此sdl的GPL / LGPLness无关紧要。
答案 0 :(得分:22)
编译项目时,需要对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系统上应该做的事情相同,但是如果使用更简单的-static
标志,它通常不会在Unix上产生那么多错误与GCC一样,就像在Windows上一样。
答案 1 :(得分:2)
通过这个SDL mailing list post,似乎sdl开发工具附带了一个sdl-config脚本,您可以使用--static-libs标志来确定需要使用哪些链接器标志。
答案 2 :(得分:1)
环境:使用Windows 7 x64和设备的VMWare虚拟机我们开发+编译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测试。
答案 3 :(得分:0)
那是因为SDL库是LGPL许可证。
如果你想静态链接libs(你可以这样做,如果你重新编译它们。虽然它需要对makefile进行一些黑客攻击)你必须将你的游戏放在一些兼容的开源许可证下。
SDL-lib作为共享库提供,因为大多数使用它们的程序都是封闭源代码。二进制分发以大多数人需要的形式出现。
答案 4 :(得分: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 _
图像的全静态二进制文件是一个糟糕的主意。 pulse,caca,aa和directfb可能会变成静态的。我还没有把它弄清楚。