Страницы

Поиск по вопросам

пятница, 12 октября 2018 г.

Аналог конфигурации object_parallel_to_source для moc_ файлов

Нашел, по слухам, недокументированную, конфигурацию qmake, позволяющую размещать объектные файлы в отдельных папках в соответствии со структурой самого проекта.
CONFIG += object_parallel_to_source
Это нужно, когда вы держите несколько классов с одинаковыми именами в разных неймспейсах, чтобы иметь одинаковые именна файлов для этих классов в разных директориях (действительно, глупо каждый раз создавать еще и разные имена файлов).
Если это классы не унаследованны от QObject все работает прекрасно, однако в обратном случает qmake создает moc_ClassName (.cpp .h) файлы, для которых правило для объектных файлов не действует, то есть все кидается в одну директорию.
Допустим мы создали два класса ActionDouble в двух разных неймспейсах и папках:
namespace Concept002 {
class ActionDouble : public Action { Q_OBJECT public: ActionDouble(QObject *parent = 0);
... };
}
и
namespace Concept003 {
class ActionDouble : public Action { Q_OBJECT public: explicit ActionDouble(QObject *parent = 0);
... signals:
public slots: };
}
получаем предупреждения и ошибки:
warning: overriding recipe for target 'moc_ActionDouble.cpp' warning: ignoring old recipe for target 'moc_ActionDouble.cpp'
и как следствие:
error: undefined reference to `vtable for Concept002::ActionDouble'

Собственно, в этом и состоит вопрос, может кто знает флаг конфигурации qmake (или же другой способ разрешения вышеописанной проблемы - иметь несколько классов в разных папках и разных неймспейсах с одним и тем же именем, и унаследованных от QObject), позволящий генерировать moc_ файлы в разных папках в соотвествии со струкурой проекта. Или, например, может быть можно сформировать моки как moc_Namespace_ClassName?


Ответ

Приложения делю на статик либы(ей же присваивается неймспейс). В одной либе нет дублирующихся имен. Причем использую подпроекты и руками указываю диру сборки по умолчанию объявляю ./build/[TARGET_ARCH] TARGET_ARCH добавляю через mkspec или в IDE Проекты -> сборка -> qmake -> Доп. параметры.
isEmpty(TARGET_ARCH){ TARGET_ARCH=x86 } BASE_PATH=$$PWD/$$TARGET_ARCH OBJECTSDIR = $$BASE_PATH/obj/$${MODULE_NAME}/$${BUILD_TYPE} DESTDIR = $$BASE_PATH/lib
Структура проекта
Module1 Module (namespace Module1) ClassA.cpp (Module1::ClassA) Test ClassA.cpp (тут unit test Fixture|Mocks) Module2 Module (namespace Module2) ClassA.cpp (Module2::ClassA) Test ClassA.cpp (тут unit test Fixture|Mocks)
Так заборол дублирующиеся имена объектников.

Комментариев нет:

Отправить комментарий