VS code + Qt6 + MinGW + CMakeでC++のプログラムをビルド
2022/03/05 categories:Qt6| tags:Qt6|Qt6.2.3|C++|CMake|MinGW|
いろいろ試行錯誤をしてビルドできるようになったのでメモします。
Qtのインストール
Qtのインストーラで下記にチェックを入れてインストールします。
Qt
├ Qt6.2.3
│ ├ MinGW 12.2.0 64-bit
│ └ Qt Debug Infomation Files
└ Developer and Designer Tools
├ MinGW 11.2.0 64-bit
└ CMake 31.1 64-bit
以下の画像がインストール画面の参考画像です。あらかじめMSVCでビルドしようとしてインストールしていたので、それらにチェックが入った状態になっていますが、MinGWとCMakeを使うなら上記の通りで十分だと思いますが、試してないのでわかりません。ちなみにmsvcでもビルドが出来たので、mingw、msvcのどちらを使っても良いかと思います。個人的にはmingwを使おうと思います。
環境変数の設定
Dドライブ直下にQtをインストールしたので、下記2つを環境変数に追加しました。
- D:\Qt\6.2.3\mingw_64\include
- D:\Qt\Tools\mingw900_64\bin
VScodeの拡張機能
VScodeの拡張機能は以下のものをインストールしました。
- C/C++
- C/C++ Extension Pack
- CMake
- CMake Tools
プログラムの作成
とりあえずフォルダを作成して、そのフォルダ内に以下の3つのプログラムを作成します。プログラムはなるべくシンプルな内容にして、QMainwindowに"hello"と書かれたQLabelを表示するだけのプログラムです。
main.cpp
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
mainwindow.cpp
#include "mainwindow.h"
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent)
{
centralwidget = new QWidget(this);
this->setCentralWidget(centralwidget);
label = new QLabel("hello");
horizontalLayout = new QHBoxLayout(centralwidget);
horizontalLayout->addWidget(label);
}
MainWindow::~MainWindow()
{
}
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QtWidgets/QApplication>
#include <QtWidgets/QHBoxLayout>
#include <QtWidgets/QLabel>
#include <QtWidgets/QMainWindow>
#include <QtWidgets/QWidget>
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
QWidget *centralwidget;
QHBoxLayout *horizontalLayout;
QLabel *label;
};
#endif // MAINWINDOW_H
CMakeLists.txtの作成
以下の通りにCMakeLists.txtを作成します。
cmake_minimum_required(VERSION 3.10)
SET(CMAKE_PREFIX_PATH "D:/Qt/6.2.3/mingw_64")
project("test005")
set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTOUIC ON)
message("Looking for Qt...")
find_package(Qt6 REQUIRED Widgets)
if (${Qt6_FOUND})
message("Found Qt " ${Qt6_VERSION})
else()
message("Couldn't find Qt")
endif()
set(sources
main.cpp
mainwindow.cpp
mainwindow.h
)
add_executable(${CMAKE_PROJECT_NAME} WIN32 ${sources})
target_link_libraries(${CMAKE_PROJECT_NAME} Qt6::Widgets)
CMake: Configure
VScodeのコマンドパレットからCmake: Configureを実行します
出力は下記のとおりで、buildというフォルダ内にファイルがいろいろ作成されます。
[main] Configuring folder: test005
[proc] Executing command: D:/Qt/Tools/CMake_64/bin/cmake.exe --no-warn-unused-cli -DCMAKE_EXPORT_COMPILE_COMMANDS:BOOL=TRUE -DCMAKE_BUILD_TYPE:STRING=Debug -DCMAKE_C_COMPILER:FILEPATH=D:/Qt/Tools/mingw900_64/bin/gcc.exe -DCMAKE_CXX_COMPILER:FILEPATH=D:/Qt/Tools/mingw900_64/bin/g++.exe -Hd:/Qt/my_program/test005 -Bd:/Qt/my_program/test005/build -G "MinGW Makefiles"
[cmake] Not searching for unused variables given on the command line.
[cmake] -- The C compiler identification is GNU 11.2.0
[cmake] -- The CXX compiler identification is GNU 11.2.0
[cmake] -- Detecting C compiler ABI info
[cmake] -- Detecting C compiler ABI info - done
[cmake] -- Check for working C compiler: D:/Qt/Tools/mingw900_64/bin/gcc.exe - skipped
[cmake] -- Detecting C compile features
[cmake] -- Detecting C compile features - done
[cmake] -- Detecting CXX compiler ABI info
[cmake] -- Detecting CXX compiler ABI info - done
[cmake] -- Check for working CXX compiler: D:/Qt/Tools/mingw900_64/bin/g++.exe - skipped
[cmake] -- Detecting CXX compile features
[cmake] -- Detecting CXX compile features - done
[cmake] Looking for Qt...
[cmake] -- Looking for pthread.h
[cmake] -- Looking for pthread.h - found
[cmake] -- Performing Test CMAKE_HAVE_LIBC_PTHREAD
[cmake] -- Performing Test CMAKE_HAVE_LIBC_PTHREAD - Success
[cmake] -- Found Threads: TRUE
[cmake] -- Performing Test HAVE_STDATOMIC
[cmake] -- Performing Test HAVE_STDATOMIC - Success
[cmake] -- Found WrapAtomic: TRUE
[cmake] -- Could NOT find WrapVulkanHeaders (missing: Vulkan_INCLUDE_DIR)
[cmake] Found Qt 6.2.3
[cmake] -- Configuring done
[cmake] -- Generating done
[cmake] -- Build files have been written to: D:/Qt/my_program/test005/build
ネットで探したCMakeLists.txtの書き方では “SET(CMAKE_PREFIX_PATH “D:/Qt/6.2.3/mingw_64”)” が書かれていなかったので、その状態でCMake: Configureを実行すると以下のようにQt6が見つからないというエラーが出てしまいます。
[main] Configuring folder: test005
[proc] Executing command: D:/Qt/Tools/CMake_64/bin/cmake.exe --no-warn-unused-cli -DCMAKE_EXPORT_COMPILE_COMMANDS:BOOL=TRUE -DCMAKE_BUILD_TYPE:STRING=Debug -DCMAKE_C_COMPILER:FILEPATH=D:/Qt/Tools/mingw900_64/bin/gcc.exe -DCMAKE_CXX_COMPILER:FILEPATH=D:/Qt/Tools/mingw900_64/bin/g++.exe -Hd:/Qt/my_program/test005 -Bd:/Qt/my_program/test005/build -G "MinGW Makefiles"
[cmake] Not searching for unused variables given on the command line.
[cmake] -- The C compiler identification is GNU 11.2.0
[cmake] -- The CXX compiler identification is GNU 11.2.0
[cmake] -- Detecting C compiler ABI info
[cmake] -- Detecting C compiler ABI info - done
[cmake] -- Check for working C compiler: D:/Qt/Tools/mingw900_64/bin/gcc.exe - skipped
[cmake] -- Detecting C compile features
[cmake] -- Detecting C compile features - done
[cmake] -- Detecting CXX compiler ABI info
[cmake] -- Detecting CXX compiler ABI info - done
[cmake] -- Check for working CXX compiler: D:/Qt/Tools/mingw900_64/bin/g++.exe - skipped
[cmake] -- Detecting CXX compile features
[cmake] -- Detecting CXX compile features - done
[cmake] Looking for Qt...
[cmake] CMake Error at CMakeLists.txt:10 (find_package):
[cmake] By not providing "FindQt6.cmake" in CMAKE_MODULE_PATH this project has
[cmake] asked CMake to find a package configuration file provided by "Qt6", but
[cmake] CMake did not find one.
[cmake]
[cmake] Could not find a package configuration file provided by "Qt6" with any of
[cmake] the following names:
[cmake]
[cmake] Qt6Config.cmake
[cmake] qt6-config.cmake
[cmake]
[cmake] Add the installation prefix of "Qt6" to CMAKE_PREFIX_PATH or set "Qt6_DIR"
[cmake] to a directory containing one of the above files. If "Qt6" provides a
[cmake] separate development package or SDK, be sure it has been installed.
[cmake]
[cmake]
[cmake] -- Configuring incomplete, errors occurred!
[cmake] See also "D:/Qt/my_program/test005/build/CMakeFiles/CMakeOutput.log".
対処方法は前述の通り、CMakeLists.txtに “SET(CMAKE_PREFIX_PATH “D:/Qt/6.2.3/mingw_64”)” と記載すれば良いようです。
CMake: Build
VScodeのコマンドパレットからCmake: Buildを実行します。結果は以下の通りです。
[main] Building folder: test005
[build] Starting build
[proc] Executing command: D:/Qt/Tools/CMake_64/bin/cmake.exe --build d:/Qt/my_program/test005/build --config Debug --target all -j 8 --
[build] [ 20%] Automatic MOC and UIC for target test005
[build] [ 20%] Built target test005_autogen
[build] [ 60%] Building CXX object CMakeFiles/test005.dir/main.cpp.obj
[build] [ 60%] Building CXX object CMakeFiles/test005.dir/test005_autogen/mocs_compilation.cpp.obj
[build] [ 80%] Building CXX object CMakeFiles/test005.dir/mainwindow.cpp.obj
[build] [100%] Linking CXX executable test005.exe
[build] [100%] Built target test005
[build] Build finished with exit code 0
ここでbuildというフォルダの中にtest005.exeという実行ファイルが作成されますが、Qtプログラムの実行に必要なdllなどが実行ファイルと同じフォルダ内に無いため以下のようなエラーが出ます。
バッチファイルとtasks.jsonでQt6をビルド&デプロイ
VScodeのtasksという機能でバッチファイルを実行して、そのバッチファイル内でビルドとデプロイを実行するようにしました。まずはbuild.batというファイルを作成して、下記の通りに記述します。
D:\Qt\Tools\CMake_64\bin\cmake.exe --build build --config Debug --target all -j 8 --
rmdir build\release /s /q
mkdir build\release
copy build\test005.exe build\release
cd build\release
D:\Qt\6.2.3\mingw_64\bin\windeployqt.exe test005.exe
処理内容は以下の通りです。
- cmakeでビルド
- build\releaseのフォルダにexeをコピー
- build\releaseに移動してwindeployqt.exeを実行
これでターミナル→タスクの実行をクリックするとビルド、デプロイができました。
build\releaseのフォルダ内にビルドしたexeと、そのexeの実行に必要なqtのdllなどがコピーされ、そのexeをダブルクリックして実行できるようになりました。
デバッグ
デバッグについてはtasksをもう少しいじったりする必要があるようですので、もう少し調べてみようと思います。