#qt #qt5 #qmake
Нашел, по слухам, недокументированную, конфигурацию 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?
Ответы
Ответ 1
Приложения делю на статик либы(ей же присваивается неймспейс). В одной либе нет дублирующихся имен. Причем использую подпроекты и руками указываю диру сборки по умолчанию объявляю ./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) Так заборол дублирующиеся имена объектников.
Комментариев нет:
Отправить комментарий