5

我正在使用 MinGW 在 Windows 上构建我的应用程序。编译和链接时,在命令行中加入“-mwindows”选项以拥有Win32 API函数。

更具体地说:在没有“-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”选项禁用控制台,这使我无法打印出调试信息。有什么方法可以同时保留控制台和选项 '-mwindows'

4

4 回答 4

18

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

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

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

gcc -mconsole -mwindows main.c

这将生成一个以控制台子系统为目标的应用程序。并且您将获得-mwindows自动链接的标准 Win32 库集。这可能是实现目标的最简单方法。

于 2012-10-27T16:56:53.750 回答
6

我没有这个答案的证据,只有一些成功的实验。如果我有一个 hello 应用程序,如下所示:

#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
于 2012-10-27T15:11:56.130 回答
1

我找到了答案。取自Using STDIN with an AllocConsole()

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

它像魔术一样工作!

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

于 2012-10-27T15:06:37.907 回答
0

您需要手动捕获 hInstance 和 nCmdShow(WinMain 参数)。您可以使用以下 C 函数来执行此操作:

HINSTANCE GetHInstance( ) {
   return (HINSTANCE) GetModuleHandleW(NULL);
}
    
int GetNCmdShow() {
   STARTUPINFOW startupInfo;
   GetStartupInfoW(&startupInfo);
   if ((startupInfo.dwFlags & STARTF_USESHOWWINDOW) != 0) {
      return startupInfo.wShowWindow;
   }
   return SW_SHOWDEFAULT;
}
于 2019-05-02T18:48:30.763 回答