C 静态编译SDL2程序时出现的问题

C 静态编译SDL2程序时出现的问题,c,sdl,static-libraries,sdl-2,C,Sdl,Static Libraries,Sdl 2,我正在Windows平台上使用C和SDL2编写一个简单的Hello World类型的程序(Cygwin上的gcc编译器,在Windows 7上运行) 只要我使用动态链接库进行编译,并且SDL2.dll文件与我运行的程序位于同一目录中,我的程序就可以正常编译和运行 但是,当我在编译时将'-static'编译器标志添加到gcc行时,会出现大量“undefined reference”错误,例如: undefined reference to `_imp__waveInAddBuffer@12' 有

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

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

但是,当我在编译时将'-static'编译器标志添加到gcc行时,会出现大量“undefined reference”错误,例如:

undefined reference to `_imp__waveInAddBuffer@12'
有人能给我指出问题所在的正确方向吗

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

编辑:我包括了起作用的gcc编译器标志(取自下面接受的答案,加上我自己的一些补充):


您的问题似乎是针对windows的,在其他系统上可能会(或不会)有所不同,尽管有些东西非常相似

我认为,如果没有依赖关系,就无法使用cygwin生成可执行文件

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

-Wl,-Bstatic SDL2main SDL2 -Wl,-Bdynamic -lws2_32 -ldinput8 -ldxguid -ldxerr8 -luser32 -lgdi32 -lwinmm -limm32 -lole32 -loleaut32 -lshell32 -lversion -luuid -lcomdlg32
-Bstatic
要求链接器使用其后的库的静态版本;
-b动态
为反向;
-Wl,
将选项传递给链接器)


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

您的问题似乎是特定于windows的,其他系统上的情况可能(或不)不同,尽管有些情况非常相似

我认为,如果没有依赖关系,就无法使用cygwin生成可执行文件

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

-Wl,-Bstatic SDL2main SDL2 -Wl,-Bdynamic -lws2_32 -ldinput8 -ldxguid -ldxerr8 -luser32 -lgdi32 -lwinmm -limm32 -lole32 -loleaut32 -lshell32 -lversion -luuid -lcomdlg32
-Bstatic
要求链接器使用其后的库的静态版本;
-b动态
为反向;
-Wl,
将选项传递给链接器)


如果使用mingw,您可能还需要
--static libgcc
--static libstdc++
(并且不依赖cygwin dll作为附加功能)。

谢谢,是的,我正在使用mingw(为了清晰起见,我在我的帖子中添加了这个)。我在gcc编译行中添加了-static libgcc和-static libstdc++,但仍然会遇到相同的错误,如:../../dev_libraries/windows/lib\libSDL2.a(SDL_windows.o):在函数
WIN\u CoInitialize':/Users/valve/release/SDL/SDL/SDL2.0.9-source/foo-x86/。/src/core/windows/SDL\u windows.c:76:未定义对
的引用__CoInitializeEx@8'所述函数应位于
ole32
;你的链接命令中有吗?是否在SDL2之后指定?基本上,对于每个函数,您必须在MSDN中搜索库名并与之链接。然而,我的答案已经有了ole32和许多你可能需要的其他答案。成功!我不得不在你建议的库的基础上再增加几个库,但我最终还是做到了。exe文件现在大约是动态链接版本的40倍大,并且它在没有可用的SDL2.dll文件的情况下运行!下面是我用来静态链接的完整gcc选项:WINDOWS\u STATIC\u COMPILER\u FLAGS=-Wl,-Bstatic-lmingw32-lSDL2main-lSDL2-Wl,-b dynamic-lws2_32-ldinput8-ldxguid-ldxerr8-luser32-lgdi32-lwinm-limm32-lole32-loleaut32-lshell32-lversion-luuid-lcomdlg32-lhid-lsetupapiI不知道一个使用SDL2的C程序依赖于许多其他动态链接的库来运行。但我想可以放心地假设所有这些库都可以在任何Windows 7机器上使用?是的,我认为所有这些都可以从Windows xp开始使用(至少是最新的service pack)。谢谢,是的,我正在使用MinGW(为了清楚起见,我在我的帖子中添加了这个)。我在gcc编译行中添加了-static libgcc和-static libstdc++,但仍然会遇到相同的错误,如:../../dev_libraries/windows/lib\libSDL2.a(SDL_windows.o):在函数
WIN\u CoInitialize':/Users/valve/release/SDL/SDL/SDL2.0.9-source/foo-x86/。/src/core/windows/SDL\u windows.c:76:未定义对
的引用__CoInitializeEx@8'所述函数应位于
ole32
;你的链接命令中有吗?是否在SDL2之后指定?基本上,对于每个函数,您必须在MSDN中搜索库名并与之链接。然而,我的答案已经有了ole32和许多你可能需要的其他答案。成功!我不得不在你建议的库的基础上再增加几个库,但我最终还是做到了。exe文件现在大约是动态链接版本的40倍大,并且它在没有可用的SDL2.dll文件的情况下运行!这是我的全部gcc选项