Вопрос вытек из моего предыдущего вопроса: cmake & qt проблемы
Оказалось, что если все файлы закинуть в одну папку, то все успешно компилируется, но стоит их разнести по разным каталогам, как все перестает работать... Тобишь: если заголовочный файл для класса с Q_OBJECT разместить в том же каталоге, что и .cpp файл с реализацией этого класса - то все работает. Но если заголовочный файл вынести в папку include, то все накрывается медным тазом.
Почему? Можно ли все-таки собирать подобные проекты для qt и как это сделать?
Ответ
Ваш заголовочный файл не был указан в списке, передаваемом в add_executable()
По умолчанию CMake пытается для каждого известного *.cpp найти в той же папке его *.h‐ или *.hpp‐пару. Благодаря этому ваш изначальный случай и собирался как задумано — CMake угадывал имя и расположение заголовочного файла и передавал его moc-у вместе со всеми прочими заголовочными файлами.
Про вашу же папку include CMake ничего не знает. Поэтому необходимо сделать одно из двух
явно поместить заголовочный файл (или файлы по glob-маске) в проект (то есть куда-нибудь внутрь add_executable()), давая возможность обработать этот файл всем, кто подписался на обработку *.hpp, в том числе и moc
либо воспользоваться тем, что moc, встретив при сканировании *.cpp-файла конструкцию вида #include "moc_имя.cpp", начинает искать для обработки файл имя.h/имя.hpp во всех местах, указанных как папки с заголовочными файлами (в том числе и по списку include_directories()). Иными словами, надо заменить строку:
#include "calculator.hpp"
на:
#include "moc_calculator.cpp"
Комментариев нет:
Отправить комментарий