qmake でVC++ 2008 Expressのプロジェクトファイルを作成する
ご利用のブラウザは、JavaScript が無効 となっていませんか?
このサイトでは、コンテンツの一部が非表示 、あるいは、コメント、お問い合わせの投稿ができない 、検索ができない ことがあります。
概要 :
Qtの環境設定について、先日、記事を書きました。
そこには、メイクファイルプロジェクトを作成して、コンパイルおよびデバッグをさせるようにしていました。
しかし、その方法では、色んなところで行き詰ってしまいます。その記事の中で記載していますように個別のライブラリなどを
追加したくても、先の記事の方法では、うまくいかないのです。例えば、吐き出されたメイクファイルに書き込んでも、
それは、次のビルドで上書きされます。共通的に行う(全プロジェクト共通)のであれば、Qtの"qmake.conf"を変更する
という手はあると思います。
果たして、これが最良の策か・・・・は、よくわかりません。
では、VC++のメイクファイルプロジェクトでなく、通常の実行(exe)ファイルプロジェクトファイルを作成することはできないのでしょうか?
答えは、マニュアルに書かれているとおり、「可能ですが、製品版"Visual Studio integration facilities "を購入したほうが良いですよ」・・・との記述があります。
今回は、そのあたりを少し記述したいと思います。
関連記事:
VC++ 2008 Expressを使ってQtの環境設定とサンプルコンパイル
早速、VC++ 2008 Expressのプロジェクトファイルを作成してみましょう
前回の記事
"VC++ 2008 Expressを使ってQtの環境設定とサンプルコンパイル" で用いた sample.cpp を使って作成してみましょう。
1
2
3
4
C:\Program Files\Microsoft Visual Studio 9.0\VC> cd C:\temp
C:\temp> qmake -project
C:\temp> qmake -tp vc temp.pro
C:\temp>
最後の"qmake -tp vc temp.pro"で"temp.pro"というQtプロジェクトファイルからVC++プロジェクトファイルを作成します。
問題は、この出来上がったVC++のプロジェクトファイルを色々と変更してしまうとQtプロジェクトと2重管理状態となってしまうことです。
Qtプロジェクトを破棄する・・・というのも一つですが、実際には、それも、このメイクファイルに通じていないと、できないようです。
例えば、MOCです。通常、MOCは、"qmake -tp vc temp.pro"のコマンドを入力した時のQtプロジェクトファイル(temp.pro)にて
MOCを実行するようにしてれば、ビルドの前に実行しますが、そうでなければ、何もしないようになります。
つまり、できあがったVC++プロジェクトにMOCを実行しなければならないソースをあとで追加してもMOCは実行してくれないことに注意しなければなりません。
1
2
3
C:\temp> qmake -tp vc temp.pro
WARNING: Generator: MSVC.NET: Found more than one version of Visual Studio, but none in your path! Fallback to lowest version ( MSVC.NET 2008 Express Edition ( 9.0) , MSVC.NET 2003 ( 7.1))
C:\temp>
このような警告メッセージが表示されることがあります。この警告は、上記では、VC++の2008,2003が存在して、どちらのプロジェクトファイルを作成して良いかわからないというメッセージです。
この場合、バージョンの古い方で作成されるようです。どちらかのVC++のバージョンを固定したい場合は、環境設定のPATHに、固定したいVC++のパスを追加すると良いです。
例えば、以下のようなイメージでDOSプロンプトで設定しても良いと思います。
1
set path=C:\Program Files\Microsoft Visual Studio 9\VC\bin\;% path %
また、各VC++のコマンドプロンプトから実行しても同様の効果を得ることができます。
[Qtマニュアルからの引用]
MOC:メタオブジェクトコンパイラ
Qt のメタオブジェクトシステムはオブジェクト間通信のためのシグナル/スロットの仕組みと実行時の型情報、動的なプロパティシステムを提供します。
メタオブジェクトシステムは以下の3つに基づいています :
* QObject クラス
* クラス定義の private 部の "Q_OBJECT" マクロ
* メタオブジェクトコンパイラ (moc)
moc は C++ ソースファイルを読み込み、 "Q_OBJECT" マクロを含むクラス定義を見つけると、そのクラスのためのメタオブジェクトコードを含む別の C++ ソースファイルを作成します。作成されたソースファイルはクラスのソースファイルに #include するか、コンパイルしてからクラスの実装にリンクします。
オブジェクト間通信のための シグナルとスロット (これはメタオブジェクトシステムを使用する主な目的です) の他に、メタオブジェクトコードは QObject にいくつかの機能を実装しています:
* 関数 className() - 実行中のクラスの名前を文字列で返します。 C++ コンパイラによる実行時の型情報 (RTTI) のサポートは必要としません。
* 関数 inherits() - オブジェクトが QObject の階層ツリーにあるクラスを継承しているクラスのインスタンスであるかどうかを返します。
* 関数 tr() - 国際化のためのスコープを持った文字列の翻訳
* 2つの関数 setProperty() と property() - 名前によるオブジェクトプロパティの動的な設定と取得を行います。
* 関数 metaObject() - クラスに関連するメタオブジェクトを返します。
Q_OBJECT マクロとメタオブジェクトコードを使わなくても QObject は基礎クラスとして使うことができますが、シグナルとスロットなどここで説明した機能は利用できなくなります。メタオブジェクトシステムの観点からすると、メタコードを持たない QObject のサブクラスは、メタオブジェクトコードを持った最も近いスーパークラスと同等です。これはつまり、例えば className() がクラスの実際の名前ではなくスーパークラスの名前を返すということです。シグナルやスロット、プロパティを使うかどうかによらず QObject のすべてのサブクラスでこのマクロを使うことを強くお勧めします。
※Qtでは、Win32 SDKやMFCなどでコールバック関数で処理するところを、シグナルとスロットという概念で置き換えています。
UNIX系には、標準で、signalがありますから感覚的にわかりやすいと思いますが、Windows系では、signalは、ほとんど、扱うことがないと思います。
Windows系だけしたやったことがない方は、少し、マニュアルを読み返した方が良いかもしれません。
他にも、
UIC:ユーザーインターフェイスコンパイラ
IDC:インターフェイスディスクリプションコンパイラ
などもあります。
プロジェクトの作成段階で、全てのフィル構成が決まっていることは、ほとんどない・・・でしょ?
ですから、このやり方は、非常に危ういと思うのです。
マニュアルの「製品版を購入した方が良い」というのは、このあたりをサポートしてくれる・・ということなのだと思います。(製品版を持ちませんのでどんなことができるかよくわかりません。)
もっと、Qt関連について詳しく知りたい方は、以下の本なども良いと思います。
Qtに関する日本語の本が少ないですね。「入門書」は、さすがに、このページを読まれるくらいの方は不要だと思います。
やっぱり、本+ネット+試してみる!!の3本柱でやっていく以外にないように思います。
コメントをどうぞ