2010-09-06 4 views
5

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

+0

Я не уверен, что понимаю этот бит: «Единственное ограничение с этой настройкой заключается в том, что я не могу определить виджеты или помощник, используя Q_OBJECT в .cpp-файлах». Вам не нужно будет запускать MOC для чего-либо, кроме файлов заголовков? –

+1

Мне удобно определять небольшой вспомогательный класс в файле .cpp и не выставлять его вне этого .cpp-файла. Для этого мне нужно иметь возможность запускать MOC на .cpp-файлах. Макро-подход 'QT4_WRAP_CPP_WITH_PREFIX', описанный в моем сообщении, работает как шарм. –

+0

@ FrançoisBeaune - Вы когда-нибудь придумывали решение для этого? Даже что-то это просто: #include #include #include класс MyClass: общественный QObject { Q_OBJECT }; int main (int, char * []) ​​ { MyClass myClass; возвращение 0; } Я не могу понять, как MOC это, поскольку он находится в файле cpp (и я получаю ошибки vtable при попытке построить его в обычном режиме). –

ответ

1

Обращаясь к документации "Использование МОС" (http://doc.qt.nokia.com/4.1/moc.html), вам нужно только импортировать «Foo. moc "в конце вашего файла реализации. Поскольку вы не можете настроить правила сборки, попробуйте экспортировать файл .pro и примените правило сборки, как это предлагается в документе nokia.

2

Последние версии CMake имеют "automoc", который работал как шарм для меня: http://blogs.kde.org/2011/11/01/cool-new-stuff-cmake-286-automoc

Просто добавьте в CMakeLists.txt:

set(CMAKE_AUTOMOC TRUE) 

, а затем в СРР (например, пример. cpp) файл:

#include "example.moc" 

(* .moc должен соответствовать имени файла cpp).

Смежные вопросы