はじめに
この記事は次の方がターゲット
- qmake を使っている方
- Windowsで開発をしている方
- なぜかリンク時にWinMainのリンクエラーが出てしまった方
経緯
Qt5.12 迄ではSUBSYSTEMが Windows の場合でも main関数で問題なく qmake で生成したMakefileでビルドできていたが Qt6.5 に移行してからビルド時に WinMain のリンクエラーが発生する様になってしまった
※ プロジェクトによっては今まで通りリンクエラーにならない
※ もしかしたらリンクするライブラリの関係かも
対応
次の対応で問題なさそう
- .pro ファイルへの記述
.pro
contains(CONFIG, console) {
DEFINES += SUBSYSTEM_CONSOLE
}
- main.cpp ファイルへの記述
main.cpp
#include <QtWidgets>
#ifdef SUBSYSTEM_CONSOLE
int main(int argv, char *argv[])
#else
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
#endif
{
#ifdef SUBSYSTEM_CONSOLE
QApplication app(argc, argv);
#else
QApplication app(__argc, __argv);
Q_UNUSED(hInstance);
Q_UNUSED(hPrevInstance);
Q_UNUSED(lpCmdLine);
Q_UNUSED(nCmdShow);
#endif
app.setApplicationDisplayName(app.tr("app name"));
QWidget w;
app.connect(&app, &Application::lastWindowClosed, &app, &Application::quit);
w.show();
return app.exec();
}
__argc
と __argv
は MSVCコンパイラの独自の拡張機能 との事
おわりに
Qtのプロジェクトでも WinMain をエントリーポイントで書けることを10数年Qtを使用しているが初めて知る
本当に自分の知識とは些細なものであることを実感