静态编译 SDL2 程序时的问题
Issues when Statically Compiling SDL2 program
我正在 Windows 平台上使用 C 和 SDL2 开发一个简单的 Hello World 类型程序(Cygwin 上的 gcc 编译器,Windows 7 上的 运行)。
只要我使用动态链接库进行编译,并且 SDL2.dll 文件与我的 运行 程序位于同一目录中,我的程序就可以正常编译和运行。
但是,当我在编译时将“-static”编译器标志添加到 gcc 行时,我得到了大量 "undefined reference" 错误,例如:
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
您的问题似乎是 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 作为额外奖励)。
我正在 Windows 平台上使用 C 和 SDL2 开发一个简单的 Hello World 类型程序(Cygwin 上的 gcc 编译器,Windows 7 上的 运行)。
只要我使用动态链接库进行编译,并且 SDL2.dll 文件与我的 运行 程序位于同一目录中,我的程序就可以正常编译和运行。
但是,当我在编译时将“-static”编译器标志添加到 gcc 行时,我得到了大量 "undefined reference" 错误,例如:
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
您的问题似乎是 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 作为额外奖励)。