9

在 Visual C++ 下,我玩过 Glut/FreeGlut/GLFW。似乎这些项目中的每个人都默认添加了一个 CMD 窗口。我尝试将其删除:

属性->C/C++->预处理器->预处理器定义

从这里,我删除 _CONSOLE 并将其替换为 _WINDOWS

然后我去了:

属性->链接器->系统->子系统

我将选项设置为 Windows (/SUBSYSTEM:WINDOWS)

然后,当我尝试在 GLFW 下编译时,出现以下构建错误:

  • 错误 1 ​​错误 LNK2001:无法解析的外部符号 _WinMain@16 MSVCRT.lib

  • 错误 2 致命错误 LNK1120: 1 unresolved externals glfwWindow.exe

是否可以删除控制台窗口?

4

8 回答 8

18

在链接器选项下,将入口点设置为mainCRTStartup。该函数对 MS libc 进行必要的设置,然后调用 main。

于 2011-06-04T20:09:10.637 回答
11

我的项目只有一个main, (no WinMain) 并且要禁用控制台,我只是将 Linker->System->SubSystem 设置为 " Windows (/SUBSYSTEM:WINDOWS)" 而不是 " Console (/SUBSYSTEM:CONSOLE)" 并且控制台消失了。

您无需弄乱预处理器定义即可删除控制台窗口。

我知道我的答案晚了几年,但我希望它有所帮助。

于 2014-06-18T12:13:29.593 回答
10

大多数链接器支持自动删除控制台启动代码的选项。

我认为在 GCC 上它被称为 -mwindows

于 2011-07-07T18:18:16.780 回答
6

非控制台 Windows 应用程序使用WinMain()入口点约定。您的 Glut 示例可能使用标准 Cmain()约定。

如果您只想快速修复演示应用程序,WinAPI 函数FreeConsole()可能会有所帮助。

MSDN: http: //msdn.microsoft.com/en-us/library/ms683150 (v=vs.85).aspx

于 2011-05-13T17:19:05.080 回答
5

要使用 cmake 摆脱控制台,可以按如下方式设置链接标志:

set_target_properties(exe_name PROPERTIES 
    LINK_FLAGS "/ENTRY:mainCRTStartup /SUBSYSTEM:WINDOWS")
于 2017-10-17T19:06:05.963 回答
1

您需要编写一个WinMain入口点并复制您现有的代码(来自main):

int CALLBACK WinMain(
  __in  HINSTANCE hInstance,
  __in  HINSTANCE hPrevInstance,
  __in  LPSTR lpCmdLine,
  __in  int nCmdShow
){
    // ...
}
于 2011-05-13T17:17:54.617 回答
0

如果您创建一个新项目作为控制台应用程序,它将始终这样运行。如果要在实际窗口中运行它,则必须创建一个新的 GUI 项目,否则将不会包含正确的头文件和库。

所需的 WinMain 函数也将包含在生成的模板文件中。

于 2011-05-13T17:16:45.810 回答
0

当我遇到这样的错误时,我可以通过在链接器中输入以下文本来修复它,部分Advance,选项入口点如下:

主要的

于 2011-05-13T17:18:13.440 回答