Я разрабатываю большой проект, используя 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