【问题标题】:Windows C++ GUI applicationWindows C++ GUI 应用程序
【发布时间】:2015-03-06 23:31:59
【问题描述】:

我目前正在将我的 C++ Qt5/CMake 应用程序从 linux 移植到 Windows。在 linux 中启动应用程序时,我看到 UI 并且一切正常。在 Windows 上首先启动黑色终端,然后从终端启动我的应用程序。如何在没有黑色控制台的情况下启动应用程序?不漂亮。

我正在使用 MSVC cmake 生成器和 Visual Studio 2013 Express。

谢谢大家!

【问题讨论】:

  • 将WIN32 参数添加到您的add_executable 应用程序名称后面。
  • 黑色终端表示您已经构建了带有控制台子系统的程序。只需使用 GUI 子系统构建程序即可。如果你有一个标准的main,那么由于你使用的是微软工具,你必须告诉链接器使用你的标准主程序,使用选项/entry:mainCRTStartup(如果我没记错的话)。这可以通过 CMake 以一些非常简单的方式完成。检查一下,但不要听从任何建议开始#if-ing 和 WinMain-ing 以及其他此类愚蠢的东西。好吧,除非你特别喜欢那样。
  • 好的。我尝试将wWinMain 替换为main。

标签: c++ windows visual-studio cmake qt5


【解决方案1】:

编辑 CMakeLists.txt 以创建 WIN32 应用程序

IF(MSVC)
    SET(OPTIONS WIN32)
ENDIF(MSVC)

ADD_EXECUTABLE(${APP_NAME} ${OPTIONS}
    ${HEADER_FILES}
    ${SOURCE_FILES}
    }

编辑 main.cpp 以使用 wWinMain 并将输入 args 转换为 argc、argv

#ifdef _MSC_VER
#   include <windows.h>
#   include <shellapi.h>
#endif

/// ... some code

#ifdef _MSC_VER
INT WINAPI wWinMain(HINSTANCE hInst, HINSTANCE hPrevInstance, LPWSTR, INT)
{
    UNREFERENCED_PARAMETER(hInst);
    UNREFERENCED_PARAMETER(hPrevInstance);

    int argc;
    char** argv;
    {
        LPWSTR* lpArgv = CommandLineToArgvW( GetCommandLineW(), &argc );
        argv = (char**) malloc( argc*sizeof(char*) );
        int size, i = 0;
        for( ; i < argc; ++i )
        {
            size = wcslen( lpArgv[i] ) + 1;
            argv[i] = (char*) malloc( size );
            wcstombs( argv[i], lpArgv[i], size );
        }
        LocalFree( lpArgv );
    }

#else
int main(int argc, char *argv[])
{
#endif

    QGuiApplication a(argc, argv);

    /// ... some code

    int code = a.exec();

#ifdef _MSC_VER
    {
        int i = 0;
        for( ; i < argc; ++i ) {
            free( argv[i] );
        }
        free( argv );
    }
#endif

    return code;
}

【讨论】:

  • 如果你用 qtmain 链接,你就不需要弄乱 main.cpp。
  • 一个标准的 C++ main 函数总是足够的。为了避免控制台窗口,OP 应该简单地指定 GUI 子系统。如何使用 Qt 和 CMAKE 之类的东西,以便它与不同的编译器和系统一起工作,只是看它的问题,可能是阅读文档。
猜你喜欢
  • 1970-01-01
  • 2010-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-05
  • 2012-06-17
  • 2011-06-05
  • 2011-12-10
相关资源
最近更新 更多