6

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.hfoo.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_CPPQT4_WRAP_CPP_WITH_PREFIX

もっと良いアイデアはありますか?

チーズ、フランツ

4

2 に答える 2

2

最近のバージョンのCMakeには、私にとって魅力のように機能する「automoc」があります:http: //blogs.kde.org/2011/11/01/cool-new-stuff-cmake-286-automoc

CMakeLists.txtを追加するだけです。

set(CMAKE_AUTOMOC TRUE)

次に、cpp(example.cppなど)ファイルで:

#include "example.moc"

(* .mocはcppファイルの名前と一致する必要があります)。

于 2012-10-30T12:19:16.463 に答える
1

「MOCの使用」(http://doc.qt.nokia.com/4.1/moc.html)のドキュメントを参照すると、実装ファイルの最後に「foo.moc」をインポートするだけで済みます。それに応じてビルドルールを微調整することはできないため、.proファイルをエクスポートして、nokiaドキュメントで提案されているビルドルールを適用してみてください。

于 2010-12-01T10:19:28.600 に答える