Страницы

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

воскресенье, 8 декабря 2019 г.

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

#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) Так заборол дублирующиеся имена объектников.

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

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