5

MinGWを使用してWindows上でアプリケーションを構築しています。コンパイルおよびリンクするとき、オプション「-mwindows」がコマンドラインに配置され、Win32API関数が使用されます。

具体的には、次のように「-mwindows」を指定せずにMinGWのGCCを呼び出す場合:

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

上記の2つのコマンドラインの後の「main.exe」はコンソールで実行され、Win32API関数は使用できなくなります。

次のように「-mwindows」を使用してMinGWのGCCを呼び出す場合:

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

'-mwindows'とリンクすると、'main.exe'はWin32APIを使用できますが、アプリケーションの実行時にコンソールは起動しません。

この「-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;
}

リンカ-mconsoleGetStockObject. _ しかし、コマンド ラインでスイッチを使用して必要なライブラリを追加する-lgdi32と、アプリは正常にコンパイルおよび実行されます。おそらく、これがコンソールと gdi の両方を保持する方法です。これはコマンドラインです:

gcc -mconsole test_gdi.c -lgdi32
于 2012-10-27T15:11:56.130 に答える
1

私は答えを見つけました。AllocConsole() での STDIN の使用から取得したもの

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 に答える