libSDL2main.a 的目的是什么?

What is the purpose of libSDL2main.a?

一些消息来源说在构建 SDL2 程序时将 -lSDL2main.a 作为 link 反对的文件之一,但有些则没有。该程序在任何一种情况下都可以正常工作。它有什么用?

其目的是使入口点在所有平台上都相同 - int main(int argc, char **argv),使用 UTF8 编码的参数。虽然它是这样的,例如linux(其中 SDLmain 不存在或为空),其他目标系统可能遵循不同的方案。

例如,windows 程序可能有不同的入口点 - mainWinMainwmain。使用 SDLmain,您不需要以不同方式处理它 - 只需像在其他系统上一样使用 main(由 SDL 重命名为 SDL_main)。

基本上在你的代码中,它只归结为 SDL_main.h header 中的这一行(如果你包含 SDL.h 则自动包含):

#define main    SDL_main

(仅在具有 SDLmain 实现的系统上)。它将你的 main 重命名为 SDL_main 并注入 system-specific 入口点(在 SDL2main 库中实现),它转换参数,进行一些 platform-specific 初始化,并调用你的SDL_main.

这是否是一件好事值得商榷;在包含 SDL.h 之前,可以使用 #define SDL_MAIN_HANDLED 禁用此功能。在那种情况下,您定义自己的 platform-specific 入口点,进行所有必需的初始化,但 SDL 要求您在调用任何其他 SDL 内容之前先调用 SDL_SetMainReady

因此,回答您的问题,为什么有时使用它而有时不使用它 - 之所以如此,是因为在某些情况下,当您已经拥有“标准”main 时,它什么都不做。