Для хранения моего спокойного проекта несколько организованным (использование спокойного Создателя), у меня есть один .pro файл и несколько .pri файлов. Просто недавно я добавил класс к одному из моих .pri файлов, который имеет то же имя файла как класс, который уже существовал в отдельном .pri файле.
Файловая структура и make-файлы, сгенерированные qmake, кажется, не обращают внимания на конфликт имени файла, который следует. Сгенерированные moc_* файлы все брошены в тот же подкаталог (или выпуск или отладка, завися) и каждый заканчивает перезапись другого. Когда я пытаюсь сделать проект, я получаю несколько предупреждений, которые похожи на это:
Makefile.Release:318: warning: overriding commands for target `release/moc_file.cpp`
И проекту не удается связаться.
Вот простой пример того, о чем я говорю.
Структура каталогов:
+ project_dir | + subdir1 | | - file.h | | - file.cpp | + subdir2 | | - file.h | | - file.cpp | - main.cpp | - project.pro | - subdir1.pri | - subdir2.pri
Содержание project.pro:
TARGET = project
TEMPLATE = app
include(subdir1.pri)
include(subdir2.pri)
SOURCES += main.cpp
Содержание subdir1.pri:
HEADERS += subdir1/file.h
SOURCES += subdir1/file.cpp
Содержание subdir2.pri:
HEADERS += subdir2/file.h
SOURCES += subdir2/file.cpp
Существует ли способ сказать qmake генерировать систему, которая помещает moc_* файлы от, разделяют .pri файлы на отдельные подкаталоги?
Лучше всего убедиться, что все файлы имеют уникальное имя. Помимо qmake, есть и другие инструменты, которые также сломаются, когда вы попытаетесь сделать то, что делаете; вы также можете запутать себя (например, понять, что делает #include "file.h"
, труднее).
Я пробовал это раньше. Короткий ответ — назвать их как-то по-другому. Другим ответом было бы рассматривать каждый подкаталог как отдельную библиотеку со своим собственным файлом .pro и использовать тип поддийных для компиляции всех каталогов библиотеки.
Если вы действительно хотите исследовать полный ответ, вы можете указать инструмент, который будет использоваться для moc. В этом случае можно исправлять имя, чтобы для двух разных файлов использовалось немного другое имя. Тем не менее, вам также нужно будет убедиться, что каждый файл с разными именами добавлен в список файлов для компиляции и связывания, а изначально -именованный файл moc не является (или сборка завершится ошибкой).
В subdir1.pri попробуйте добавить
MOC_DIR = "subdir1/MOCFiles"
Также для subdir2.pri дайте
MOC_DIR = "subdir2/MOCFiles"
Это не проверено. Просто проверьте это. Надеюсь, это сработает.
Edit 1 : Где MOCFiles - это ваша желаемая папка для moc файлов, в которую вы хотите попасть.
Edit 2 : Я просто перестал упоминать о директории MOC-файлов, так как это было специально задано в вопросе. Но дополнительно вы можете добавить следующее в каждый из файлов pri. (Убедитесь, что папки разные для разных *.pri файлов)
RCC_DIR = "subdir1/RCCFiles"
UI_DIR = "subdir1/UICFiles"
OBJECTS_DIR = "subdir1/ObjFiles"
Я считаю, что несколько pri файлов могут работать без коллизий, имея одинаковые имена файлов. Поскольку вы приняли ответ (в котором говорится, что это невозможно), внесите вышеуказанные изменения и попробуйте. Сообщите, если это не сработает.