web-dev-qa-db-ja.com

Qt 4.5アプリがWindowsでコンソールウィンドウを開くのはなぜですか?

LinuxでQtCreator4.5をいじっています。私のアプリケーションはLinuxでも問題なくビルドできますが、Windowsでビルドすると、アプリは起動時に常にコンソールウィンドウを開きます。

それをやめてもいいですか?

私はデフォルトのMinGWセットアップを使用して構築していますが、おそらくそれは関連しています。必要に応じて、Visual Studioでビルドできますが、最初に何が起こっているのかを理解したいと思います...

編集:WindowsでQt Creatorを使用して簡単なテストGUIアプリを作成しましたが、この動作は見られませんでした。この動作は、プロジェクトがLinuxで作成された方法が原因で発生したか、アプリが実行してコンソールウィンドウが表示される原因があります。それが他の誰かを助ける場合に備えて、私がそれを診断するときに詳細を投稿します。

30
Paul Dixon

簡単に言うと、Qt testlibを含めると、コンソールが表示されます。それを取り除くと消えます。

さらに説明すると、.proファイルがtestlibをQTに追加する場合、たとえば、.

QT += sql \
    webkit \
    network \
    testlib

次に、最後のリンクステップは次のような行で実行されます

g++ -enable-stdcall-fixup 
   -Wl,-enable-auto-import 
   -Wl,-enable-runtime-pseudo-reloc 
   -mthreads 
   -Wl 
   -Wl,-subsystem,console 
   -o debug\MyApp.exe object_script.MyApp.Debug  
   -L"c:\Qt\2009.01\qt\lib"  
   -lglu32 -lgdi32 -luser32 -lQtWebKitd4 -lQtTestd4 
   -lQtSqld4 -lQtGuid4 -lQtNetworkd4 -lQtCored

コンソールサブシステムを使用することになりました。 testlibを使用すると、これが強制的に発生し、テスト出力がどこかに移動するようになると思います。

ここで.proファイルを編集し、testlibへの参照を削除して再構築すると、次のようなリンク手順が表示されます。

g++ -enable-stdcall-fixup 
   -Wl,-enable-auto-import 
   -Wl,-enable-runtime-pseudo-reloc 
   -mthreads 
   -Wl 
   -Wl,-subsystem,windows 
   -o debug\Ammotin.exe object_script.Ammotin.Debug  
   -L"c:\Qt\2009.01\qt\lib" 
   -lglu32 -lgdi32 -luser32 -lmingw32 -lqtmaind -lQtWebKitd4 
   -lQtSqld4  -lQtGuid4 -lQtNetworkd4 -lQtCored4

わーい!サブシステムはウィンドウであり、コンソールウィンドウではありません。

17
Paul Dixon

これはこの特定の答えの解決策ではないと思います(4年後を除いて)が、このスレッドに着陸する多くの人々がこの設定を探していると思います:

プロジェクト>ビルドと実行>実行設定>実行> [x]ターミナルで実行

選択を解除し、追加のターミナルウィンドウなしでQtCreatorからGUIを実行します。その後、端末出力がIDEに埋め込まれます。

9
fbeeper

-mwindowsスイッチが提供されていることを確認する必要があります。

編集:

または、メイクファイルに移動して、これをリンカーフラグに追加することもできます。

-Wl,-subsystem,windows
8
John T

CMakeを使用してこの問題を抱えている人のために、私は本当の解決策を見つけました ここ 。自分で確認しました。

つまり、add_executable()ステートメントにWIN32を追加する必要があります。

add_executable(GuiApplication WIN32 src/main.cpp)
6
Lion

.proファイルが変数consoleCONFIGを追加しないことを確認してください。あなたは追加することによってこれを行うことができます

_CONFIG -= console
_

.proファイルの最後のどこかにあります。 CONFIGconsoleが含まれている場合、プログラムを起動するたびにウィンドウがポップアップします。これは、デバッグ出力を出力するときにも使用されます。したがって、consoleを追加すると、プログラムをデバッグするときに役立ちます。それ以外の場合は、 DebugView などのツールを使用してqDebug()呼び出しの出力を表示する必要があります。

4
bluebrother

Qmakeの代わりにcmakeを使用しています。 set(CMAKE_CXX_FLAGS "-mwindows")を使用したので、.proファイルのQMAKE_CXXFLAGS + =-mwindowsでも同じように見えます。

3
Craig

リンカー設定がコンソールアプリに設定されているようです。/subsystem:windowsオプションを使用するようにリンカーを設定してみてください。コンソールアプリケーションのオプションは/ subsystem:consoleです。 Visual Studioでプロジェクトをビルドする場合は、Win32プロジェクトを作成します。 Win32コンソールアプリを作成しないでください。サブシステムを設定するためのVisualStudioの下のオプションは、[プロジェクト設定]-> [リンカー]-> [システム]-> [サブシステム]の下にあります。 Windows(/ subsystem:windows)を選択します。

MinGW/gccでこれを行う方法を調べました。 gcc のオンラインドキュメントには、Windowsターゲットのさまざまなオプションが示されています。他の人が述べたように、あなたが探しているオプションは-mwindowsです。オプション-mwindowsは、ウィンドウ化されたアプリを作成します。現在の設定は-mconsoleのようです。オプション-mconsoleは、コンソールアプリを生成します。これはリンカーオプションです。私はQtCreatorに精通していませんが、VisualStudioと同様の方法でプロジェクト設定を表示できると思います。

3
zooropa

Projects --> Runに移動し、Run in terminalチェックボックスのチェックを外します

1
Artem Zaytsev

Qt/2009.05/qt/mkspecs/win32-g ++
編集ファイルqmake.conf
行を変更
QMAKE_LFLAGS_CONSOLE = -Wl、-subsyetem、console

QMAKE_LFLAGS_CONSOLE = -Wl、-subsyetem、windows

???。proファイルを変更します(例:新しい行またはスペースを追加します)
そしてコンパイル
正常に動作しています

0
Eda

デフォルトでは、リンカはコンソールアプリケーションが必要であると想定しています。

修正は、コンパイラの引数リストに「-mwindows」を追加することです。これにより、必要なライブラリ(-lkernel32、-lgdi32など)も目に見えない形で追加されます。おそらく、エントリポイントとしてmain()からWinMain()に変更する必要があります。

RE:編集: Qtビルドシステムは「spec」ファイルを使用して変数を追加します。変数は$ QTDIR/qt/mkspecsにあります。 QCreatorで新しいWindowsアプリを作成すると、デフォルトの仕様が「win32-g ++」に設定され、正しい変数(Windowsアプリ、リンカーフラグなど)が自動的に設定されます。

Linuxでプロジェクトを作成したとき、別の仕様が使用されていたため、問題が発生しました。現在の仕様は「yourproject.pro.user」ファイルで確認できます。

0
Alex Ruse