在 Visual C++ 下,我尝试过 Glut/FreeGlut/GLFW。似乎所有这些项目都默认添加了一个 CMD 窗口。我尝试将其删除:
属性->C/C++->预处理器->预处理器 定义
从这里,我删除 _CONSOLE 并将其替换为 _WINDOWS
然后我进入:
属性->链接器->系统->子系统
我将选项设置为 Windows (/SUBSYSTEM:WINDOWS)
然后,当我尝试在 GLFW 下编译时,出现以下构建错误:
错误 1 错误 LNK2001:未解决 外部符号_WinMain@16 MSVCRT.lib
错误2致命错误LNK1120:1 未解析的外部glfwWindow.exe
是否可以删除控制台窗口?
在链接器选项下,将入口点设置为 mainCRTStartup 。该函数对 MS libc 进行必要的设置,然后调用 main。
大多数链接器支持自动删除控制台启动代码的选项。
我认为在 GCC 上它被称为 -mwindows
我的项目只有一个
main
(没有WinMain
)并且要禁用控制台,我只需将链接器->系统->子系统设置为“Windows (/SUBSYSTEM:WINDOWS)
”而不是“Console (/SUBSYSTEM:CONSOLE)
”,控制台就会消失。
您不需要弄乱预处理器定义来删除控制台窗口。
我知道我的回答晚了几年,但我希望它有帮助。
要使用 cmake 摆脱控制台,可以按如下方式设置链接标志:
set_target_properties(exe_name PROPERTIES
LINK_FLAGS "/ENTRY:mainCRTStartup /SUBSYSTEM:WINDOWS")
非控制台 Windows 应用程序使用
WinMain()
入口点约定。您的 Glut 示例可能使用标准 C main()
约定。
如果您只想快速修复演示应用程序,WinAPI 函数
FreeConsole()
可能会有所帮助。
MSDN:http://msdn.microsoft.com/en-us/library/ms683150(v=vs.85).aspx
您需要编写一个
WinMain
入口点并复制现有代码(来自 main
):
int CALLBACK WinMain(
__in HINSTANCE hInstance,
__in HINSTANCE hPrevInstance,
__in LPSTR lpCmdLine,
__in int nCmdShow
){
// ...
}
如果您创建一个新项目作为控制台应用程序,它将始终这样运行。如果你想在实际窗口中运行它,你必须创建一个新的 GUI 项目,否则将不会包含正确的标头和库。
所需的 WinMain 函数也将包含在生成的模板文件中。
当我遇到这样的错误时,我可以通过在链接器,部分高级,选项入口点中输入以下文本来修复它:
主要
以下是如何在
Visual Studio
下解决该问题的详细说明,无需重写代码:
现在您可以在使用控制台的调试配置或不使用控制台的发布配置下编译项目。您可以以任何常见形式使用输入功能:
int main() {}
int main(int argc, char** argv) {}
我个人更喜欢第二种。感谢Chao和elmindreda,我给你们投票了!