MinGW,用控制台构buildGUI应用程序

我正在使用MinGW在Windows上构build我的应用程序。 在编译和链接时,选项“-mwindows”放在命令行中,具有Win32 API的function。

更具体地说:在不使用“-mwindows”的情况下调用MinGW的GCC时:

c:\>g++ -c main.cpp c:\>g++ -o main.exe main.o 

上述2个命令行之后的“main.exe”将使用控制台运行,而Win32 API函数将不可用。

当用这样的“-mwindows”调用MinGW的GCC时:

 c:\>g++ -c main.cpp c:\>g++ -o main.exe main.o -mwindows 

现在与“-mwindows”链接,“main.exe”可以使用Win32 API,但是,当应用程序运行时,它不会启动控制台。

这个“-mwindows”选项禁用了控制台,这使我无法打印出debugging信息。 任何方式来保持控制台和选项'-mwindows'

我没有这个答案的证据,只有一点成功的实验。 如果我有一个你好的应用程序,像这样:

 #include <stdio.h> #include <windows.h> int main(void) { puts("hi"); MessageBox(NULL, "test", "test", NULL); GetStockObject(0); return 0; } 

我不能-mconsole编译它 ,因为连接器抱怨GetStockObject 。 但是当我在我的命令行中添加-lgdi32开关所需的库时 ,应用程序编译并执行干净。 也许这是保持控制台和gdi的方法。 这是命令行:

 gcc -mconsole test_gdi.c -lgdi32 

-mconsole开关用于指定您要定位控制台子系统。 如果从控制台应用程序启动,您确实希望确保您的进程连接到现有的控制台。 例如,假设你按照自己的答案走下了定位GUI子系统的路线,然后调用AllocConsole() 。 然后,你会发现你的应用程序显示一个全新的控制台,而不是从另一个控制台应用程序,如cmd.exe启动时使用现有的。

如果您需要使用其他库,则可以使用-l在命令行上自由添加它们。 没有什么特别的控制台应用程序,这意味着它不能链接到任何Win32 API函数。 这只是与-mconsole相关的默认库集缺少一些你想要的库。

另一方面,当您构建应用程序时,您可以同时使用-mconsole-mwindows 。 它们不是相互排斥的。

 gcc -mconsole -mwindows main.c 

这会生成一个针对控制台子系统的应用程序。 而且你会得到自动链接的Win32库的标准-mwindows集合。 这可能是实现你的目标的最简单的方法。

我找到了答案。 从使用STDIN和AllocConsole()

 AllocConsole(); freopen("CONIN$", "r",stdin); freopen("CONOUT$","w",stdout); freopen("CONOUT$","w",stderr); 

它像魔术般运作!

参考“freopen”: http ://www.cplusplus.com/reference/clibrary/cstdio/freopen/