Я разрабатываю большой проект с использованием Qt 4.6, CMake 2.8 и Visual Studio 2008 для платформы Windows.Qt, CMake, Visual Studio и Q_OBJECT в CPP файлы
Как далеко строится система, все это стандартное вещество: я использую макрос CMake QT4_WRAP_CPP
для генерации файлов moc из заголовочных файлов, которые затем связаны с окончательным исполняемым файлом в команде add_executable
. Все работает так, как ожидалось.
Единственное ограничение с этой настройкой заключается в том, что я не могу определить виджеты или помощник, используя Q_OBJECT
в .cpp файлов. Это было бы очень удобно для небольших контекстно-зависимых классов-помощников, которые должны появляться рядом с тем, где они используются.
Я пытался передать весь список исходных файлов (как .h и .cpp) в 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 позволяет только одно правило сборки на файл, и .cpp файлы уже есть правило сборки (компиляции на объект файл), так что этот подход не работает, по крайней мере, с Visual Studio ,
Другая идея, что у меня было, чтобы создать новый макрос, скажем QT4_WRAP_CPP_WITH_PREFIX
, основанный на QT4_WRAP_CPP
(который определен в доли/CMake-2,8/Модули/Qt4Macros.cmake), что бы дополнительный аргумент префикс и добавит этот префикс к сгенерированным файлам moc. Таким образом, я бы назвал QT4_WRAP_CPP_WITH_PREFIX
дважды, один раз для .h файлов и один раз для .cpp файлов, с разными приставками. То, что мне просто не нравится в этом подходе, это то, что я буду возиться с внутренними компонентами поддержки CMt от CMake, вместо использования публичного API.
Любая идея?
Cheerz, Franz
Я не уверен, что понимаю этот бит: «Единственное ограничение с этой настройкой заключается в том, что я не могу определить виджеты или помощник, используя Q_OBJECT в .cpp-файлах». Вам не нужно будет запускать MOC для чего-либо, кроме файлов заголовков? –
Мне удобно определять небольшой вспомогательный класс в файле .cpp и не выставлять его вне этого .cpp-файла. Для этого мне нужно иметь возможность запускать MOC на .cpp-файлах. Макро-подход 'QT4_WRAP_CPP_WITH_PREFIX', описанный в моем сообщении, работает как шарм. –
@ FrançoisBeaune - Вы когда-нибудь придумывали решение для этого? Даже что-то это просто: #include #include #include класс MyClass: общественный QObject { Q_OBJECT }; int main (int, char * []) { MyClass myClass; возвращение 0; } Я не могу понять, как MOC это, поскольку он находится в файле cpp (и я получаю ошибки vtable при попытке построить его в обычном режиме). –