2012-03-04 9 views
1

qtチュートリアルからウィンドウレイアウトの例を実行しようとしているときにタイトルに記載されている組み合わせを使用しています。Qt + CMake + VC++がコマンドプロンプトを生成する

#include <QtGui> 

int main(int argc, char **argv) { 
    QApplication app(argc, argv); 
    QWidget window; 
    QLabel *label = new QLabel(QApplication::translate("windowlayout", "Name:")); 
    QLineEdit *lineEdit = new QLineEdit(); 

    QHBoxLayout *layout = new QHBoxLayout(); 
    layout->addWidget(label); 
    layout->addWidget(lineEdit); 
    window.setLayout(layout); 
    window.setWindowTitle(
     QApplication::translate("windowlayout", "Window layout")); 
    window.show(); 
    return app.exec(); 
} 

そして、このようなCMakeLists.txt:このような主なルックス

PROJECT(test) 
CMAKE_MINIMUM_REQUIRED(VERSION 2.8.0) 

FIND_PACKAGE(Qt4 REQUIRED) 
INCLUDE_DIRECTORIES(${QT_INCLUDE_DIR} ${QT_QTCORE_INCLUDE_DIR} ${QT_QTGUI_INCLUDE_DIR}) 

SET(test_SRCS main.cc) 

QT4_AUTOMOC(${test_SRCS}) 

ADD_EXECUTABLE(test ${test_SRCS}) 

TARGET_LINK_LIBRARIES(test ${QT_QTGUI_LIBRARIES} ${QT_QTCORE_LIBRARIES}) 

建物やコンパイル作業を適切けど、私はアプリケーションを実行すると、それは常に、コマンドプロンプトを表示します。どうすればそれを避けることができますか?

答えて

3

Qt4を使用するCMakeFileでは、CPPコードを変更したり、コンパイル時にフラグを追加したりする必要はありません。単に使用する

set(QT_USE_QTMAIN TRUE) 

自動的にqtmain.libを実行可能ファイルにリンクします。このライブラリは、WinMain()を含む他の共通のmain()シグネチャを定義します。

このトリックでは、IDE(QtCreator)の外でアプリケーションを実行するときに、元のmain()関数をmofiyingせずに、コンソールを表示せずにWindowsでMSVCでアプリケーションをコンパイルできます。

最終結果CMakeLists.txtをすることができます:

PROJECT(test) 
CMAKE_MINIMUM_REQUIRED(VERSION 2.8.0) 

FIND_PACKAGE(Qt4 REQUIRED) 
if(WIN32) 
    SET(QT_USE_QTMAIN TRUE) 
endif(WIN32) 

INCLUDE(${QT_USE_FILE}) 

SET(test_SRCS main.cc) 

QT4_AUTOMOC(${test_SRCS}) 

ADD_EXECUTABLE(test ${test_SRCS}) 

TARGET_LINK_LIBRARIES(test ${QT_LIBRARIES}) 

Additionnaly、あなたがQtCoreとQtGuiを含める必要はありません、彼らはQT_USE_FILE(フォルダを含めるため)とQT_LIBRARIES(ライブラリ用)にデフォルトで含まれています。

あなただけが使うモジュールものを設定する必要があり、またはあなたが(GUI用)は使用しないでください:

# Use Network and Sql modules 
set(QT_USE_QTNETWORK TRUE) 
set(QT_USE_QTSQL TRUE) 
# Do not use Gui module 
set(QT_DONT_USE_QTGUI TRUE) 
+0

Qt5にはどのようなオプションを設定する必要がありますか? –

+0

あなたはこのスレッドで回答を見つけることができます:http://stackoverflow.com/questions/14115024/how-to-link-qtmain-in-cmake-with-qt5/14164144#14164144 'target_link_libraries(myExecutable Qt5 :: WinMain) ' – Antwane

8

あなたはGUIアプリケーションをしたいというCMakeのを伝える必要があります:あなたがWindows上でコンパイルされたときに、これはWinMain()からmain()からプログラムのエントリを変更すること

# GUI Type 
if(WIN32) 
    set(GUI_TYPE WIN32) 
endif(WIN32) 
if(APPLE) 
    set(GUI_TYPE MACOSX_BUNDLE) 
endif(APPLE) 

ADD_EXECUTABLE(test ${GUI_TYPE} ${test_SRCS}) 

注意をので、あなたがあなたを修正する必要がありますソースも同様です。 は、ここで私は通常、何をすべきかです:

#ifdef _WIN32 
class Win32CommandLineConverter; 

int CALLBACK WinMain(HINSTANCE /* hInstance */, HINSTANCE /* hPrevInstance */, LPSTR /* lpCmdLine */, int /* nCmdShow */) 
{ 
    Win32CommandLineConverter cmd_line; 
    return main(cmd_line.argc(), cmd_line.argv()); 
} 


class Win32CommandLineConverter { 
private: 
    std::unique_ptr<char*[]> argv_; 
    std::vector<std::unique_ptr<char[]>> storage_; 
public: 
    Win32CommandLineConverter() 
    { 
     LPWSTR cmd_line = GetCommandLineW(); 
     int argc; 
     LPWSTR* w_argv = CommandLineToArgvW(cmd_line, &argc); 
     argv_ = std::unique_ptr<char*[]>(new char*[argc]); 
     storage_.reserve(argc); 
     for(int i=0; i<argc; ++i) { 
      storage_.push_back(ConvertWArg(w_argv[i])); 
      argv_[i] = storage_.back().get(); 
     } 
     LocalFree(w_argv); 
    } 
    int argc() const 
    { 
     return static_cast<int>(storage_.size()); 
    } 
    char** argv() const 
    { 
     return argv_.get(); 
    } 
    static std::unique_ptr<char[]> ConvertWArg(LPWSTR w_arg) 
    { 
     int size = WideCharToMultiByte(CP_UTF8, 0, w_arg, -1, nullptr, 0, nullptr, nullptr); 
     std::unique_ptr<char[]> ret(new char[size]); 
     WideCharToMultiByte(CP_UTF8, 0, w_arg, -1, ret.get(), size, nullptr, nullptr); 
     return ret; 
    } 
}; 
#endif 
+0

条件文が厳密に必要とされていません。 'WIN32'と' MACOSX_BUNDLE'オプションは適用されないプラットフォームでは無視されるので、 'add_executable(myApp WIN32 MACOSX_BUNDLE $ {sources})'だけを使うことができます。そして、あなたがQtを使っているなら( '他の人が指摘しているように)' $ {QT_QTMAIN_LIBRARY} 'にリンクして' WinMain'を提供する必要がなくなります。 – Matthew

6

私はコンソールを非表示にするには、リリースビルドをしたかったが、他のすべてがそれを表示するために構築します。その使用を行うには:

if(${CMAKE_SYSTEM_NAME} MATCHES "Windows") 
    SET_TARGET_PROPERTIES(MyApp PROPERTIES LINK_FLAGS_DEBUG "/SUBSYSTEM:CONSOLE") 
    SET_TARGET_PROPERTIES(MyApp PROPERTIES RELWITHDEBINFO "/SUBSYSTEM:CONSOLE") 
    SET_TARGET_PROPERTIES(MyApp PROPERTIES LINK_FLAGS_RELEASE "/SUBSYSTEM:WINDOWS") 
    SET_TARGET_PROPERTIES(MyApp PROPERTIES MINSIZEREL "/SUBSYSTEM:WINDOWS") 
endif(${CMAKE_SYSTEM_NAME} MATCHES "Windows") 

をこれには、次のリンカエラーご紹介します:あなたのCMakeLists.txtファイルにはQT_QTMAIN_LIBRARYとリンク修正する error LNK2019: unresolved external symbol [email protected] referenced in function ___tmainCRTStartup

TARGET_LINK_LIBRARIES(MyApp ${QT_LIBRARIES} ${QT_QTMAIN_LIBRARY} ${OTHER_STUFF_TO_LINK}) 

今、あなたはしないでください以前のソリューションと同様にソースを変更する必要があります。

+0

FindQt4.cmakeを使用していない場合、このソリューションは機能しますか?これはCMAKE機能かQMAKE機能かどちらかですか? – cppguy

関連する問題