emblog Qtのあれ

Qt関連のあれだったり、これだったり

QtCreatorのプロジェクトファイル(.pro)で使用される変数について

はじめに

qbs1.0.0がリリース*1されちゃってあれなんですが、Qtのプロジェクトファイル(.pro)に記載される変数とMakefileの関係を少し。
主として、僕の環境がlinuxなのでlinux寄りの記載になりますが、WindowsでもMacでも参考にはなるかと思います。

QtのProjectFileについて

QtCreatorでProjectを作成されるプロジェクトファイル(.pro)ですが、
QtCreatorで使用されるだけでなく、qmakeの引数で渡す事によりMakeファイルを作成する事に使用されます。(下図)
f:id:sazus:20130604191252p:plain:w800

この為、プロジェクトファイルの記載された変数によって、
make時に生成されるアプリケーション名や、コンパイル環境毎にデバックオプション等を
個別につけたりできます。

デフォルトの変数

以下、プロジェクトの新規作成で、Qt GUIアプリケーションを選択した時に
プロジェクトファイルにデフォルトで追加される変数の説明です。

QT

QTのモジュールを使用する時に使用する変数です。以下が付加できるパラメータです。

付加するパラメータ 使用モジュール
core QtCore モジュール
gui QtGui モジュール
widgets QtWidgets モジュール(Qt4では、QtGuiモジュールに
含まれているので不要
network QtNetwork モジュール
opengl QtOpenGL モジュール
sql QtSql モジュール
svg QtSvg モジュール
xml QtXml モジュール
webkit WebKit 関連(link先はWebView)

TARGET

生成される実行ファイル名を設定します。
デフォルトでは、プロジェクト名になります。
Makefileでも、TARGETとして記載があります。

TEMPLATE

Makefleの種類を設定します。以下のパラメータを選択します。

付加するパラメータ 使用モジュール
app アプリケーションとしてbuidする
Makefileを生成します。
lib ライブラリとしてbuildする
Makefileを生成します。
subdirs サブディレクトリ中のプロジェクトのMakefileを作成します。
ディレクトリは別途、SUBDIRS変数を使用して指定します。
vcapp VisualStudioのアプリケーションプロジェクトファイルを作成します。
vclib VisualStudioのライブラリプロジェクトファイルを作成します。

SOURCES

Projectで使用されるソースファイルを指定します。
e.g.
main.cppを登録しておくと、linux環境でのgccMakefileでは、

$(CXX) -c $(CXXFLAGS) $(INCPATH) -o debug/main.o main.cpp

のように追加されていきます。

HEADERS

Projectで使用されるヘッダファイルを指定します。
e.g.
SOURCESにhoge.cppを登録しておき、hoge.cpp内部に#include"hoge.h"としている場合
linux環境でのgccMakefileでは、

$(CXX) -c $(CXXFLAGS) $(INCPATH) -o debug/hoge.o: hoge.cpp hoge.h

のように追加されていきます。

変数に設定する演算子について

以下のように扱います。詳細はこちら

代入(=)

e.g.

QT = core gui

QtCore モジュール(core)、QtGuiモジュール(gui)を設定します。

削除(-=)

e.g.

QT -= gui

QtGuiモジュール(gui)の設定を削除します。

追加(+=)

e.g.

QT += network

QTに設定されている設定値にプラスして、QtNetworkモジュール(network)を追加する。

すでに存在していない場合のみ追加(*=)

e.g.

QT *= network

QTに設定されている設定値で、QtNetworkモジュール(network)が設定されていなければ追加する。

その他

RESOURCES

リソースファイルを追加すると出てくるあれ
リソースコレクションファイル(.qrc)を設定します。
qrcに追加された画像などは、バイナリファイルとしてアプリケーション(もしくはライブラリ)内に格納されます。
リソースファイルについての詳細は、QtCore 5.0: The Qt Resource System | Documentation | Qt Project
に詳細なドキュメントがあります。

TRANSLATIONS

翻訳ファイル(.ts)のファイルを設定します。
使い方の詳細は
QtLinguist : Qt Linguist Manual: Developers | Documentation | Qt Project
に詳細がドキュメントがありますが、
Qt@福岡勉強会(facebook)を主催しておられる@vivisukeさんの本に詳しい説明がされており、僕はこっちでお勉強しましたw。

Qtプログラミング入門―使いやすいフレームワークを基礎から解説 (I・O BOOKS)

Qtプログラミング入門―使いやすいフレームワークを基礎から解説 (I・O BOOKS)

DEFINES

Makefileに-Dのプリプロセッサオプション*2を追加します。
gccの -Dオプションについて:
-Dhoge - マクロhogeを文字列1として定義してくれます。
参照:Preprocessor Options - Using the GNU Compiler Collection (GCC)
e.g.

DEFINES += TEST

とすると、
Makefileには、

DEFINES = -DTEST

が追加されます。

LIBS

プロジェクトにリンクするライブラリの設定を行います。

  • Linuxの場合は、 -Lでライブラリの検索をするディレクトリ指定-lでライブラリ名の指定を行います。
    gccの参照:-Lオプション-lオプション
  • Windowsの場合は、ライブラリファイルまでのフルパス指定を行います。
    qt-projectのページのNOTEにあるようにWindowsの場合は、-lオプションを指定しない方がいいようです。
    例えば、-lmath等すると、libmathlibの代わりにlibmath2.libといった最も高いバージョン番号のライブラリが使用されるっぽいです。
    なので、使用したいライブラリ名を明示的に指定するほうがいいらしい。
    (組み込み専門でWindowsは知らないので...誰か詳しい人コメントよろしく)

また、ディレクトリ名に" "(スペース)が含まれる場合には、""で囲みます
e.g.
Linuxの場合
/usr/local/lib/libhoge.soを設定する場合(ディレクトリにスペースなし)
/home/usr/my lib/libfuga.soを設定する場合(ディレクトリにスペースあり)

LIBS += -L/usr/local/lib -lhoge
LIBS += "-L/home/usr/my lib" -lfuga

Windowsの場合
c:/libs/hoge.libを設定する場合(ディレクトリにスペースなし)
c:/my libs/fuga.lib(ディレクトリにスペースあり)

LIBS += c:/libs/math.lib
LIBS += "c:/my libs/fuga.lib"

INCLUDEPATH

指定されたディレクトリをヘッダファイルを検索するリストとして設定します。
gccの -Dオプションについて:
参照-Iオプション
e.g.
f:id:sazus:20130608210510p:plain
上記のようなディレクトリ構成の場合で、
a.cppや、b.cppがab.hを#includeする場合

#include"../dir_h/ab.h"
・・・

と記載が必要ですが
プロジェクトファイルに、

INCLUDE += $$PWD/dir_h

NOTE:"$$PWD"の変数はparsedされ、現在のファイルを含むディレクトリに至る完全なパスに置き換えてくれます。
とプロジェクトファイルに記載しておく事により
a.cppや、b.cppでのab.hのincludeを

#include"ab.h"
・・・

の記載でも大丈夫になります。
linux環境でかつシャドービルドONの場合、gccMakefileでは、
INCPATH = -I/opt/Qt/qtlib/Qt5.1.0beta/5.1.0-beta1/gcc_64/mkspecs/linux-g++ -I../SampleProject -I../SampleProject/b
とQtlibraryのpathが最初にきて、その後プロジェクトのディレクトリ
その次に指定がされました。
(../SampleProject 等になっているのは、シャドービルドでは、プロジェクトディレクトリと同位のディレクトリpathにbuild用のディレクトリが生成され、その中にMakefileが生成される為。)
演算子の指定が"="でも"+="でもこの順番は変わっていませんでした。(演算子はこの変数では意味がないかもしれないです。)

最後に

Macでもいろいろ確認してみたいので、誰かMacください!

*1:qmakeはビルド用のファイルを生成するツールなのですが、qbsはビルドも実行しちゃうツールらしいっす。

*2:プリプロセス - ソースプログラムに対してコンパイル前に行われる前処理のこと