Qt の ORM QxOrmを使ってみる

Qt の Orm である QxOrm を使ってみたくなったので、MacOS にインストールを試みた。

あらかじめ言っておきますが、試みただけで、(動くことは動いたが)完全にうまくいったというわけではないので念の為。

この手のややマイナーなソフトはメンテなどが手薄な感は否めない。

トライアル1

手順は QxOrm の公式ページで案内されている。

案内は windows のみなので、Mac の場合は適宜読み換える。

1 まず、Qt をインストール。

ここは問題ないでしょう。ただし、Qt5 で説明しているが、現在(2023/1月頃)の最新版は 6.2.4 である。
後で説明すると思うが、Qt6 では、このバージョン(1.4.8)はビルドできないことがわかっている。

2 qmake がコマンドラインから使えるように  PATH を修正。

今後のことを考えるとここはやっておいた方がいいでしょう

3, 4 boost の lib_shared を使えるようにしておく(optional)

ただし、boost は必須ではない。開発者も言っているが、ビルドできるかもわからない段階で無理してこの機能を試す必要性は薄い。

5 QxOrm 本体のダウンロード

ダウンロードページはこちら。これを書いている時点でのバージョンは 1.4.8 。

6 boost を使う場合は、QxOrm の QxOrm.pri を適宜編集

上で触れたように、ここは飛ばしましょう。

7 QXORM_DIR を環境変数に加える。

ここはやっておきましょう。

この後、8, 9, 10 とサンプルを試す手順が説明されているのだが、当たり前だが、QxOrm のライブラリ自体が構築されていないのでリンカエラーが出る。

というわけで、ライブラリを構築する。。。のだが、ここでエラー。

打開策

GitHub にいくと、Unable compile QxOrm1.4.8 というド直球な issue が立っている。

開発側は

I can build QxOrm and all examples without any issue with Qt 6.2.3, so I think it should be OK with Qt 6.2.4 (if you download latest version on GitHub, which should be : QxOrm_1.4.9_BETA_18)

と、1.4.9 を使えと言っている。

しかし、有償のライセンス(無償と有償のダブルライセンス)もあるのに、これはいかんのでは?と思わないでもない。

トライアル2

というわけで、GitHub から 1.4.9 を落としてきて、ビルド。

 

今度は、ビルド成功。

添付のサンプルを動かしたみた限りでは動作も問題なさそう。

wt::dbo vs odb vs QxOrm

ところで、C++ の ORM は定番というものがない。

QxOrm, odb, wt::dbo あたりがそこそこは知られているのだが、wt::dto の作者さんがユーザーさんの質問に答える形で3者の相違について語ってます。(→ 記事

 

Qt

最近、すっかりご無沙汰の Qt。

睡魔と戦いながら、boost と Qt をインストール。

経験ある人ならわかると思うが、両者のインストール時間は極めて長い。

薄れいく意識の中、操作をしていたので、起きたら、どこに Qt をインストールしたのかわからなくなったw

デフォルトだとホーム直下に Qt というフォルダがつくられ、その中に Qt Creator がある。

ライセンス

わかりにくいと評判の Qt で作成したアプリのライセンス。

ええと、これ、Qt でスタティックライブラリでアプリを作るのでなければ、LGPL っすよね。

Qt で作成した部分に関しては、公開の義務なし。

「スタティックライブラリでなければ」と書いたが、公式にもスタティックのライブラリ群は提供されておらず、意識的に(かなり苦労して)スタティックライブラリでアプリを構築する以外はダイナミックリンクで作成せざるを得ない。

実質、LGPL っすよね。

なんであんなわかりにくい書き方するんだろ?

サンプル

なんやかんやで環境は整ったので、サンプルを実行。

M1/M2 Mac でも普通に 3D が描画できているのはエラい。

基本事項のおさらい

IDE は Qt Creator だが、ビルドシステムで qmake を選んだ場合は qmake で ****.pro を走らせている。

実際にはもうちょっと複雑なビルドシステムになっている。

なお ****.pri は PRojectInclude ファイルの略。

Qt6 からは、ビルドに cmake を選べるようになった。この場合は、当然、CMakeLists.txt を使っている。

試しにこちらのオプションでハロワしたが、いや、ほんと、普通の cmake プロジェクト。

 

 

 

 

C++ ORM

C++ の ORM を物色中。

bun

ソースコード:GitHub

メモ:boost と SOCI というのが必要。

bun 自体は Mac で動かすには修正が必要。それよか SOCI はなかなか良いプロジェクト。

 

江添 C++ 本と本家ストラウストラップ本

プロになる Java』で Java の教科書的な書籍を取り上げたので、今度は C++ で。

当初、江添 C++ 本のみ取り上げようと思ったんだが、やっぱり(世にいう)ストラウストラップ本も必要かな?と思い、最初の版よりかなり内容変わってます。

ある程度実用的に C や C++ 使うんだったら、両方必要でしょう。

ワイの場合、C はまあまあ使えていたから、ここら辺から入ったが、C 未習の人は、この前に C の基礎をやっておいた方がいいでしょう。

江添 C++ 本

しっかり書かれた本ならなんでもいいと思うのだが、取り組みやすさを考えるならば『江添亮の C++ 入門』あたりがオススメ。

取り組みやすさ、というのは、この本のイントロが GitHub で公開されている、というのもその理由の一つ。

標準ライブララリを一つのヘッダファイルでまとめる話が第 2 章で出てくるが、こんなのいちいち打ち込むわけにもいかない。ここが該当箇所。

まあ、ならサンプルコード一覧つけてくれよ、と思わないでもないが。

これはケチをつけているわけではなく、Mac でこのコードを動かそうとしても動かない場合があるから。

‘cstdalign’ file not found エラーの回避方法

ワイの環境の場合、

‘cstdalign’ file not found

というエラーが出る。

なお、これを一番簡単に回避する方法は、以下のように cstdalign をコメントアウトして

#include <cstddef>
#include <limits>
#include <climits>
#include <cfloat>
#include <cstdint>
#include <cstdlib>
#include <new>
#include <typeinfo>
#include <exception>
#include <initializer_list>
//#include <cstdalign>
#include <stdexcept>
#include <cassert>
#include <cerrno>
#include <system_error>
#include <string>
#if __has_include(<string_view>)
# include <string_view>
#endif
#include <array>
#include <deque>
#include <forward_list>
#include <list>
#include <vector>
#include <map>
#include <set>
#include <unordered_map>
#include <unordered_set>
#include <queue>
#include <stack>
#include <iterator>
#include <algorithm>
#include <cfenv>
#include <random>
#include <numeric>
#include <cmath>
#include <iosfwd>
#include <iostream>
#include <ios>
#include <streambuf>
#include <istream>
#include <ostream>
#include <iomanip>
#include <sstream>
#include <fstream>
#if __has_include(<filesystem>)
# include <filesystem>
#endif
#include <cstdio>
#include <cinttypes>
#include <regex>
#include <atomic>
#include <thread>
#include <mutex>
#include <shared_mutex>
#include <condition_variable>
#include <future>
using namespace std::literals ;

これをコンパイル。

g++ -std=c++17 -include all.h -o hello hello.cpp

などとする方法だろう。

こうすれば、mac でもとりあえずは動く。

 

しかし、この本、冒頭で「オススメ」とか書いちゃったが、今、読み返してみると、これは初学者向けの本ではないべ。

関数の説明でいきなりラムダ式

例えば、「関数」の説明でいきなりラムダ式が出てくるw

int main(){

    auto print = [](auto x){
        std::cout << x << "\n";
    };

    print("hello");
}

いや、手順通りにやれば確かに hello とは表示されるんですけどね。

あとで、これは本物の関数ではないと断っているんですが、お戯れ感がすごい。

実は class という言葉はなかなか出てこない

ほとんど struct で通しているw

というか今読み返している箇所では、今のところ class 出てきてねー(笑)。

C++ では関数も struct で扱えるからこれでも大した差は出ないんだが、

class のデフォルトでのアクセシビリティはデフォルトで private

struct のデフォルトでのアクセシビリティはデフォルトで public

という違いはある。
(『C++ における class と struct の違い』あたり参照)

実用的にはこれでも問題ないと思うが、多くの初学者が思う

「オブジェクト指向の特徴の一つ=カプセル化」

概念からすると違和感感じるかもしれない。

ここら辺はいわゆるストラウストラップ本の「C++ の言語機能の中核は、クラス(class)である」のような説明と一線を画す。
実際、ストラウストラップ本では、まず complex というクラス(名前から予想がつくように複素数を取り扱うクラス)の説明から入っている。

なお、たまに誤解している人もいるが struct でも継承はできます。

だから、「オブジェクト指向なので class というキーワードや使い方を期待している読者もいるかもしれないが、実用的には struct で代用できるので、ここでは struct で説明していく」と一言断っておけばいいんですよね。

また、Objective-C でも class は出てきません(@class というディレクティブはあるが、Java のようにわかりやすい形で class という単語が使われているわけではない)。NSObject を継承していて @property でメソッドが定義されているものがクラスだ、という風に理解されていると思います。

何をもってオブジェクト指向というのか?という宗教論争を引き起こしかねない話をここでする気はないので、まあ、そこら辺はスルーします。

テンプレートの説明はわかりやすい

逆にテンプレートのサンプルはわかりやすかったりする。

template <typename T>
T twice(T n){
    return n * 2;
}

int main(){
    twice(3);
    twice(3.14);
}

ああ、なるほど、こう書けば、いちいち型を気にする必要はありませんね。

プリプロセッサ

ここもわかりやすい。例えば

_cplusplus 具体的には C++17 ならば 201703L

あたりとか(40.8)。

なんというか書くのが疲れてきた(と思われる)後半に入って、わかりやすい記載になっていくのが興味深い。

ポインタ

著者が自信を持っていうだけあって、わかりやすくはあると思う。

ただ、これも初学者にはどうか?

スマートポインタ

ここもある程度慣れた人にとってはわかりやすいと思う。

スマートポインタ→生ポインタ (36章)あたりは、「へー、そういうことだったんですか!」といたく納得した。

 

(続く)