这是我的代码:
Lib.h
#ifdef ExportLib
#define Lib __declspec(dllexport)
#else
#define Lib __declspec(dllimport)
#endif
extern void Lib Launch();
Lib.cpp
#include <SDL/SDL.h>
#include "Lib.h"
void Launch() {
SDL_Init(SDL_INIT_EVERYTHING);
SDL_Window* win = SDL_CreateWindow("Untitle", 100, 100, 400, 400, 0);
SDL_DestroyWindow(win);
SDL_Quit();
}
我将此代码构建到静态库。然后我创建了一个新的源文件并使用了这个库。
的main.cpp
#include "Lib.h"
int main() {
Launch();
return 0;
}
最后,我使用静态库编译main.cpp,而不定义SDL_main和SDL的依赖。工作正常,窗口出现。
但是真的很好吗?我失去了哪些功能?答案 0 :(得分:5)
SDL_main
is for SDL's automatic initialization and cleanup.这主要是因为您不需要手动执行此操作,但它也需要在平台上为窗口应用程序正确设置所有内容。 ;编译,但它fine #define
SDL_MAIN_HANDLED
之前#include
main
SDL.h之前,这将阻止SDL转向SDL_main
进入SDL_main
的宏只需确保在您自己的代码中正确初始化并退出SDL。
如果您想确保自己正确进行必要的初始化,可以just check the source code并模拟其中的内容。
编辑:
在某些平台上,SDL_Init will fail如果您不使用SDL_SetMainReady
。您可以在SDL_Init
之前调用SDL_SetMainReady
来禁用此失败,但请注意这将禁用SDL的错误处理,如果您在调用{{1}}后未正确初始化SDL,则表示您已赢得&#39 ; t得到最清楚的错误消息。
退出SDL为much more straightforward(如果您未使用SDL_main,也需要执行此操作):
完成SDL后,只需致电SDL_Quit
即可。这将正确关闭当前活动的任何SDL子系统。
答案 1 :(得分:1)
我在没有定义SDL_main的情况下使用SDL功能。那没关系吗?
可能,可能不是。请改用SDL_SetMainReady()来确定:
SDL_SetMainReady
:使用此功能可以避免在不使用SDL_main()作为入口点时SDL_Init()
失败。