Ubuntu でもアプリの開発環境を立ち上げてみました。IDE としては、無難なところで VSCode を選びました。Mac でも Python とか Javascript 開発で一応使った経験はあります。Linux だからといって emacs や vim を使うほどの超ガチ勢ではないので、まあこんなところでしょう。
Visual Studio Code - The open source AI code editor | Your home for multi-agent development
VSCode は公式サイトから deb ファイルをダウンロードしてきてインストールします。Discover で探すと snap 版が見つかるのですが、これには「日本語が入力できない」という致命的な欠点があります。
【Ubuntu22.04】VSCodeで日本語が入力できない場合の対処法 - Qiita
日本語でコメントを書きたい 私は Visual Studio Code でC++やPythonを書いています。 OSをUbuntu20.04から22.04にアップデートしたところ、日本語入力ができなくなったのでメモ。 ちなみにブラウザの検索窓など、VSCode以外ではちゃ...
とりあえずやってみたいこととして、wxWidgets/C++ でアプリが書けるようにします。Linux でアプリ開発をするといっても、今から GTK や Qt をイチから覚えるのはちょっとキツい。また、一時 wxLua やら wxPython にも手を出したのですが、使い捨てのツールならともかく、公開して他人でも使えるモノにしようとすると、いろいろ問題が出てきます。最終的には、ネイティブバイナリにコンパイルできるのが最強です。その点では、一番確実なのは wxWidgets のネイティブ言語である C++ ですね。
VSCode がまだよくわかってないので、いろいろ試行錯誤しました。今のところ、こんな環境に落ち着きつつあります。
1. VSCode の機能拡張として、C/C++ Extension, CMake Tools をインストールする。
C/C++ Extension は当然でしょう。この機会に make から cmake に移行しようと思っているので、CMake Tools を入れました。
2. Linux の開発環境を整える。
$ sudo apt install build-essential cmake git libwebkit2gtk-4.1-dev
最後の libwebkit2gtk-4.1-dev は、wxWebView を使うのに必要です。Linux における libwebkit2gtk の互換性問題はなかなかややこしいことになっていますが、その話はまたの機会に。
3. wxWidgets を自前でビルドして、静的ライブラリを作っておく。
アプリ開発のプロジェクトディレクトリは $HOME/Development/wxMyProjects/{プロジェクト名} と決めておきます。リンクする wxWidgets のバージョンを確実に特定するため、自前でビルドして、$HOME/Development/wxMyProjects/extlibs 以下にインストールしておきます。
$ curl -L https://github.com/wxWidgets/wxWidgets/releases/download/v3.2.11/wxWidgets-3.2.11.tar.bz2 >wxWidgets-3.2.11.tar.bz2
$ tar xfj wxWidgets-3.2.11.tar.bz2
$ cd wxWidgets-3.2.11
$ mkdir build-linux-temp; cd build-linux-temp
$ ../configure --disable-shared --with-opengl --enable-monolithic --disable-sys-libs --prefix=$HOME/Development/wxMyProjects/extlibs 2>&1 | tee configure.log
$ make -j 4 2>&1 | tee make.log
$ make install 2>&1 | tee install.log
$ make distclean
4. プロジェクトフォルダのルートに CMakePresets.json を作成する
せっかく wxWidgets で書くんだったら、同じプロジェクトで Linux, Mac, Windows のどれでもビルドできるようにしたいところです。使うコンパイラの種類(Linux は g++, Mac は clang++)、デバッグ/リリースビルドの区別、作業用ディレクトリの場所などを決めておくため、CMakePresets.json を使ってプリセットを定義します。(とりあえず Linux と Mac 用です。Windows は後で考えます)
{
"version": 3,
"cmakeMinimumRequired": {
"major": 3,
"minor": 20,
"patch": 0
},
"configurePresets": [
{
"name": "linux-base",
"hidden": true,
"generator": "Ninja",
"binaryDir": "${sourceDir}/build/${presetName}"
},
{
"name": "linux-gxx-debug",
"inherits": "linux-base",
"condition": {
"type": "equals",
"lhs": "${hostSystemName}",
"rhs": "Linux"
},
"cacheVariables": {
"CMAKE_BUILD_TYPE": "Debug",
"CMAKE_C_COMPILER": "gcc",
"CMAKE_CXX_COMPILER": "g++"
}
},
{
"name": "linux-gxx-release",
"inherits": "linux-base",
"condition": {
"type": "equals",
"lhs": "${hostSystemName}",
"rhs": "Linux"
},
"cacheVariables": {
"CMAKE_BUILD_TYPE": "Release",
"CMAKE_C_COMPILER": "gcc",
"CMAKE_CXX_COMPILER": "g++"
}
},
{
"name": "macos-base",
"hidden": true,
"generator": "Ninja",
"binaryDir": "${sourceDir}/build/${presetName}",
"cacheVariables": {
"CMAKE_C_COMPILER": "clang",
"CMAKE_CXX_COMPILER": "clang++"
}
},
{
"name": "macos-debug",
"inherits": "macos-base",
"condition": {
"type": "equals",
"lhs": "${hostSystemName}",
"rhs": "Darwin"
},
"cacheVariables": {
"CMAKE_BUILD_TYPE": "Debug"
}
},
{
"name": "macos-release",
"inherits": "macos-base",
"condition": {
"type": "equals",
"lhs": "${hostSystemName}",
"rhs": "Darwin"
},
"cacheVariables": {
"CMAKE_BUILD_TYPE": "Release"
}
}
],
"buildPresets": [
{
"name": "build-linux-debug",
"configurePreset": "linux-gxx-debug"
},
{
"name": "build-linux-release",
"configurePreset": "linux-gxx-release"
},
{
"name": "build-macos-debug",
"configurePreset": "macos-debug"
},
{
"name": "build-macos-release",
"configurePreset": "macos-release"
}
]
}
5. CMakeLists.txt を作る。
まだよくわかってないんですが、あちこち調べたり Google Gemini に教えてもらったりしながら、ここまでたどり着きました。
cmake_minimum_required(VERSION 3.20) # 使うcmakeのバージョン
project(firstapp) # プロジェクトの名前
set(EXTLIBS "$ENV{HOME}/Development/wxMyProjects/extlibs") # extlibs のパス
# 他の依存ライブラリも同じ場所に置く予定
set(wxWidgets_CONFIG_EXECUTABLE "${EXTLIBS}/bin/wx-config") # FindwxWidgets のために wx-config の位置を指定
find_package(wxWidgets REQUIRED COMPONENTS core base) # wxWidgets を見つける
include(UsewxWidgets) # wxWidgets を使うのに必要なフラグを設定
set(SOURCES MyApp.cpp) # ソースファイルを列挙(ここでは1つだけ)
if(APPLE)
add_executable(FirstApp MACOSX_BUNDLE ${SOURCES}) # Mac のアプリケーションバンドルの作成を指示
else()
add_executable(FirstApp ${SOURCES}) # 実行ファイルの作成を指示
endif()
target_compile_features(FirstApp PUBLIC cxx_std_17) # コンパイルフラグ
target_link_libraries(FirstApp PRIVATE ${wxWidgets_LIBRARIES}) # wxWidgets のライブラリを追加
set_target_properties(FirstApp PROPERTIES OUTPUT_NAME "MyApplication") # 実行ファイルの名称を指定
6. MyApp.cpp を作る。
例えば下のようなものです。
#include <wx/wx.h>
class MyApp : public wxApp {
public:
virtual bool OnInit();
};
class MyFrame : public wxFrame {
public:
MyFrame(const wxString& title);
};
bool MyApp::OnInit() {
MyFrame *frame = new MyFrame(_T("最小のwxWidgetsアプリ"));
frame->Show(true);
return true;
}
MyFrame::MyFrame(const wxString& title)
: wxFrame(NULL, wxID_ANY, title, wxDefaultPosition, wxSize(400, 300)) {
}
wxIMPLEMENT_APP(MyApp);
7. VSCode で開く。
上記の3つのファイルを含んだディレクトリを VSCode で開きます。最初に、一番上の行に "Restricted Mode is intended for safe code browsing."という表示が出ます。このままだと読み出しのみで変更ができないため、Manage を押して、"Trust" を指示します。
すると、「構成の事前設定を選択してください (Select a configure preset)」というメニューが出て、CMakePresets.json の "configurePresets" に書いたプリセットを選ぶように促されます。最初は debug を選びます。
このメニューは、VSCode から別のアプリに移ると消えてしまいます。そのときは、VSCode の左のカラムにある CMake Tools のアイコンを選び、「構成」(Configuration) のリストを開いて、右端のえんぴつマークを押すと、同じメニューが現れます。
Configuration を選ぶと、CMakeLists.txt がチェックされます。ここでエラーが出た場合は、何か問題があると思われるので、頑張って解決します。エラーがなくなったら、画面一番下の「Build」を押すとビルドが始まります。ここもきっとエラーが出るので、頑張って解決します。エラーがなくなったら、虫のアイコンを押すと、デバッガ (gdb) 上での実行が始まります。
ここから先は、Xcode などでの開発と同じなので、特筆すべきことはありません。CMakeLists.txt の書き方を頑張って覚えなくちゃな、というところです。
