Qt, CMake, Visual Studio и Q_OBJECT в файлах cpp

Я разрабатываю большой проект, используя Qt 4.6, CMake 2.8 и Visual Studio 2008 для платформы Windows.

Что касается системы сборки, то это все стандартные вещи: я использую CMake ' s макрос QT4_WRAP_CPP для генерации moc-файлов из заголовочных файлов, которые затем связываются с конечным исполняемым файлом в команде add_executable . Все работает, как и ожидалось.

Единственное ограничение в этой настройке состоит в том, что я не могу определить виджеты или помощника, используя Q_OBJECT в файлах .cpp . Это было бы очень удобно для небольших, зависящих от контекста классов помощников, которые должны появляться рядом с тем местом, где они используются.

Я попытался передать весь список исходных файлов (как .h , так и .cpp ) - QT4_WRAP_CPP , а не только файлы заголовков, но это не работает (связывание не удается, поскольку некоторые символы, связанные с moc, не определены).

Мне кажется, проблема является то, что для данной пары файлов 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 допускает только одно правило сборки на файл, а файлы .cpp уже имеют правило сборки (компиляция в объектный файл), поэтому этот подход не работает, на по крайней мере с Visual Studio.

Еще одна идея, которая у меня была, заключалась в создании нового макроса, скажем, QT4_WRAP_CPP_WITH_PREFIX , основанный на QT4_WRAP_CPP (который определен в share / cmake-2.8 / Modules / Qt4Macros.cmake, который принимает [дополнительный аргумент], , принимает дополнительный аргумент [11]), и принимает дополнительный аргумент: добавил бы этот префикс к сгенерированным файлам moc. Таким образом, я бы вызвал QT4_WRAP_CPP_WITH_PREFIX дважды, один раз для файлов .h и один раз для файлов .cpp , с разными префиксами. Что мне просто не нравится в этом подходе, так это то, что я буду возиться с внутренними компонентами поддержки Qake в CMake вместо использования общедоступного API.

Есть идея получше?

Cheerz, Franz

6
задан François Beaune 6 September 2010 в 15:45
поделиться