我正在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
答案 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作为额外的奖励)。