Нашел, по слухам, недокументированную, конфигурацию 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)
Так заборол дублирующиеся имена объектников.
Комментариев нет:
Отправить комментарий