Qt のビルド

Qtをビルドしないといけなくなった。その前に他の理由から OpenSSL 1.1.0 をインストールしていた。

Qt は OpenSSL 1.0.1 までしか正式対応しておらず、ここで一つの壁にぶち当たる。特になにも指定せず、configure & make をすると、OpenSSL に関する所でコンパイルエラー。OpenSSL のバージョンアップに伴う変更で、後方互換がとれていないのが原因。しかたがないので、1.0.1 を 個別にインストールして使う事にするのだけど、どうやって指定すればよいのかよくわからない。

Secure Sockets Layer (SSL) Classes | Qt Network 5.8 に指定の仕方が書いてある。試しに、

$ OPENSSL_DIR=[OpenSSLインストール先] OPENSSL_LIB="-L[インストール先]/lib -lssl -lcrypto" ./configure --ssl-runtime 

で試してみる。が、コンパイルでエラー。

 qtbase/src/netowork でこけるので、 qtbase/src/network/Makefile 中の INCDIR に -I${openssl インストーディレクトリ}/include を指定すれば、一応OK。このMakefileは qmake で生成されるようなので、 qmake をもうすこし調べれば良いと思うのだけど・・・

 上記編集さえしてしまえば、一応ビルドは問題なく進んでいるようす。

Qt 5.8.0 with gcc 6.3.0 での問題

具体的にはQt5でもgccでもなくて、多分OSの事情による問題が起きたと思われる。きっと今時のKernelなら問題なくコンパイルも通ったはず。

問題1

qtserialbus/src/plugins/canbus/socketcan/socketcanbackend.cpp

コンパイルに失敗。sa_family_t に関しては linux/netlink.h を include する事で回避。でも AF_CAN、PC_CANが未定義と怒られる。linux/socket.h で定義されているので、正しくインクルードすれば良いようなきがするのだが、上手くいかない。なので、直接該当ファイル中で定義。これでよいのか?

問題2

qtgamepad/src/plugins/gamepads/evdev/qevdevgamepadbackend.cpp

コンパイルに失敗。BTN_TRIGGER_HAPPY{1,2,3,4} が未定義との事。普通は linux/input.h やら linux/input-event-codes.h やらで定義されている様子。件のシステムにはちょっと古めのKernelがインストールされていて、該当の定義がない。そもそもゲームパッドを使うような事はないので、こちらもソースに直接定義を追加して回避。

Qt 4.8.6 with gcc 6.3.0 での問題

Qt 5.8.0 では問題ないようなので、4系のみの問題?c++11への対応が不十分な所があり、ところどころでコンパイルエラーが発生する。-std=gnu++98 を指定して回避できる所は回避する。

ポインターを返すべき所で false を返す箇所がある。きっと NULL で良いのだと推測し、NULLポインタを返すように回避。これでよいのか?