Qt 4.6、CMake 2.8、および Windows プラットフォーム用の Visual Studio 2008 を使用して大規模なプロジェクトを開発しています。
ビルド システムに関する限り、それはすべて標準的なものです。CMake のQT4_WRAP_CPP
マクロを使用してヘッダー ファイルから moc ファイルを生成し、add_executable
コマンドで最終的な実行可能ファイルにリンクします。すべてが期待どおりに機能しています。
このセットアップの唯一の制限は、.cpp ファイルで使用するウィジェットまたはヘルパーを定義できない Q_OBJECT
ことです。これは、使用されている場所のすぐ隣に表示される小さなコンテキスト固有のヘルパー クラスにとって非常に便利です。
ヘッダー ファイルだけでなく、ソース ファイルのリスト全体 ( .hと.cppの両方) をに渡そうとしましたが、うまくいきません (いくつかの moc 関連のシンボルが定義されていないため、リンクは失敗します)。QT4_WRAP_CPP
問題は、特定のファイルfoo.hとfoo.cppのペアに対して、QT4_WRAP_CPP
マクロが同じディレクトリに同じ moc ファイル ( moc_foo.cxx ) を生成することであり、明らかに最初のファイルがその結果、リンク時にシンボルが失われます。
その問題を修正または回避する方法はありますか? たとえば、次の形式のfoo.cppに特定のルールを追加しようとしました。
QT4_GENERATE_MOC(directory/foo.cpp directory/foo.moc)
そして追加
#include "foo.moc"
foo.cppの最後に。これは機能するはずですが、悲しいことに、Visual Studio ではファイルごとに 1 つのビルド ルールしか許可されておらず、.cppファイルには既にビルド ルール (オブジェクト ファイルへのコンパイル) があるため、少なくとも Visual Studio ではこのアプローチは機能しません。
私が持っていた別のアイデアは、( share/cmake-2.8/Modules/Qt4Macros.cmakeで定義されているQT4_WRAP_CPP_WITH_PREFIX
) に基づいて、新しいマクロを作成することでした。これは、追加のプレフィックス引数を取り、このプレフィックスを生成された moc に追加します。ファイル。そうすれば、 .hファイルに対して 1 回、.cppファイルに対して 1 回、異なるプレフィックスを付けて2 回呼び出します。このアプローチについて私が嫌いなのは、パブリック API を使用する代わりに、CMake の Qt サポートの内部をいじることになることです。QT4_WRAP_CPP
QT4_WRAP_CPP_WITH_PREFIX
もっと良いアイデアはありますか?
チーズ、フランツ