与C版本SDL2链接时,从D隐藏控制台



基本上,在编写SDL窗口应用程序时,我会得到一个不想看到的控制台窗口。

在C中,答案很简单:将链接器子系统更改为Windows;SDL完成剩下的工作。它有一个宏,可以将main重新定义为SDL_main,它从自己隐藏的WinMain函数内部调用它。只要确保你在主函数中接受了参数,一切都会顺利进行。

在D中,我遇到了更多的问题。通过将-L/SUBSYSTEM:WINDOWS传递给链接器来简单地更改子系统,它会通知我我已经声明了main,SDL已经声明了WinMain,它不知道如何处理。我认为将签名从void main()更改为extern(C) int SDL_main(int argc, char*[] argv)可以解决问题,但后来链接器说它找不到D的任何运行时符号。可能与用C编写的入口点有关?

另一方面,我的问题可能是如何设置Derelict。我在这个存储库中工作,它是GitHub上所有不同Derelict存储库的实时更新混合体。在我的VisualD解决方案中,我有三个相关的项目:一个包含到SDL2和实用程序库的源代码的家庭重写Derelict项目,以及这里的C-API SDL2和SDL2main项目。我编译并链接到所有三个生成的库——Derelict和SDL2main是静态的,SDL2是动态的。我不太倾向于说这种设置是罪魁祸首,因为除了永恒的控制台窗口外,它运行得很好。

在传递给DMD的命令行中,添加链接器选项-L/SUBSYSTEM:WINDOWS

如果您使用dub(我建议使用)和gdc,请在您的dub.json文件中插入以下内容:

"dflags": ["-Wl,--subsystem,windows"]

最新更新