Страницы

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

Показаны сообщения с ярлыком qmake. Показать все сообщения
Показаны сообщения с ярлыком qmake. Показать все сообщения

воскресенье, 9 февраля 2020 г.

системы сборки c++ в qt

#cpp #qt #cmake #qmake #qbs


Переустановив qt (звучит как прям история,minGW для qt на windows 64-bit(и не только))
и отогнав сомнения насчет minGW я захотел в qt creator написать hello world...

И тут задумался:что за системы сборок? Пользовался qmake(потому что по дефолту стояла).

Короче можете простыми словами объяснить что такое qmake,Cmake,Qbs...Пожалуйста
    


Ответы

Ответ 1



qmake - система сборки, родная для Qt. Не знаете что использовать - берите ее. Нативно работает с QtCreator. Cmake - популярная система сборки. Умеет собирать разнообразные проекты под разнообразные оси/среды разработки. Умеет собирать и Qt проекты, но требует немного "телодвижений". QtCreator умеет с ней хорошо работать, но иногда как то оно странно (но может это мне везет). qbs - попытка "исправить qmake", написать все заново и правильно. Также всякие новомодные штуки - json подобный стиль файла проекта, модули, сборки под разные оси. почитать холивора на lor от самий разработчиков Qt статистика

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

понедельник, 15 апреля 2019 г.

системы сборки c++ в qt

Переустановив qt (звучит как прям история,minGW для qt на windows 64-bit(и не только)) и отогнав сомнения насчет minGW я захотел в qt creator написать hello world...
И тут задумался:что за системы сборок? Пользовался qmake(потому что по дефолту стояла).
Короче можете простыми словами объяснить что такое qmake,Cmake,Qbs...Пожалуйста


Ответ

qmake - система сборки, родная для Qt. Не знаете что использовать - берите ее. Нативно работает с QtCreator. Cmake - популярная система сборки. Умеет собирать разнообразные проекты под разнообразные оси/среды разработки. Умеет собирать и Qt проекты, но требует немного "телодвижений". QtCreator умеет с ней хорошо работать, но иногда как то оно странно (но может это мне везет). qbs - попытка "исправить qmake", написать все заново и правильно. Также всякие новомодные штуки - json подобный стиль файла проекта, модули, сборки под разные оси. почитать холивора на lor от самий разработчиков Qt статистика

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