静态编译SDL2程序时的问题

时间:2018-12-21 13:38:15

标签: c sdl static-libraries sdl-2

我正在Windows平台(Cygwin上的gcc编译器,在Windows 7上运行)上使用C和SDL2开发一个简单的Hello World类型的程序。

只要使用动态链接的库进行编译,我的程序就可以正常运行,并且SDL2.dll文件与正在运行的程序位于同一目录中。

但是,当我在编译时在gcc行中添加“ -static”编译器标志时,会出现诸如此类的大量“未定义引用”错误:

undefined reference to `_imp__waveInAddBuffer@12'

有人能指出我这里问题的正确方向吗?

编辑:我忘记指定要使用MinGW作为我的编译器工具链。

编辑:我包括了有效的gcc编译器标志(摘自下面的可接受答案,以及我自己的一些补充内容):

-Wl,-Bstatic -lmingw32 -lSDL2main -lSDL2 -Wl,-Bdynamic -lws2_32 -ldinput8 -ldxguid -ldxerr8 -luser32 -lgdi32 -lwinm m -limm32 -lole32 -loleaut32 -lshell32 -lversion -luuid -lcomdlg32 -lhid -lsetupapi

1 个答案:

答案 0 :(得分:2)

您的问题似乎是特定于Windows的,尽管某些事情非常相似,但其他系统上的事情可能(也可能没有)不同。

我认为您可以在没有cygwin1.dll依赖的情况下使用cygwin生成可执行文件。

-static阻止链接程序考虑任何动态库,而不仅仅是SDL。 Windows安装中有很多dll(因此您可以期望它们会出现在目标系统上),但它们没有静态版本,并且如果程序的任何代码使用了它们(无论是您的代码还是在其中) (例如SDL),则无法在此处使用-static生成可执行文件。您可以使用某些库的静态版本,例如SDL-需要具有相应的.a(或MSVC为.lib),指定所述库具有的所有依赖项(因为.a没有依赖项信息内置,而动态库则),例如对于SDL2,可能类似于

-Wl,-Bstatic SDL2main SDL2 -Wl,-Bdynamic -lws2_32 -ldinput8 -ldxguid -ldxerr8 -luser32 -lgdi32 -lwinmm -limm32 -lole32 -loleaut32 -lshell32 -lversion -luuid -lcomdlg32

({-Bstatic要求链接器使用之后的静态库版本; -Bdynamic是反向的; -Wl,...将选项传递给链接器)

如果使用mingw,您可能还需要--static-libgcc--static-libstdc++(并且不依赖cygwin dll作为额外的奖励)。