Избегайте дублирования объектных файлов, используя структуру subdir с qmake

У меня есть игра с двумя отдельными проектами для самого приложения и тестов. Я строю все проекты в исходном коде. Вот сокращенная версия структуры моего проекта:

game
game.pro
app
app.pro
Entity.h
Entity.cpp
Entity.o
moc_Entity.cpp
moc_Entity.o
tests
layer
layer.pro
Entity.o (duplicated)
moc_Entity.cpp (duplicated)
moc_Entity.o (duplicated)
tst_Layer.cpp

app.pro:

QT += core gui

greaterThan(QT_MAJOR_VERSION, 4) {
QT += widgets
}

TARGET = cotw-clone
TEMPLATE = app

MOC_DIR = .moc
OBJECTS_DIR = .obj

HEADERS += MainWindow.h \
Map.h \
Tile.h \
Character.h \
Layer.h \
NewGameDialog.h \
GameController.h \
Stair.h \
Random.h \
MapGenerator.h \
TileData.h \
Statistics.h \
StatisticsDialog.h \
StatisticWidget.h \
Range.h \
Level.h \
RandomMapGenerator.h \
AiController.h \
MonsterJournalWidget.h \
InventoryDialog.h \
PathSearch.h \
PathNode.h \
Path.h \
Geometry.h \
EntityDatabase.h \
EntityData.h \
Entity.h \
CharacterData.h \
EntityMetadata.h

SOURCES +=\
MainWindow.cpp \
Map.cpp \
Tile.cpp \
Character.cpp \
Layer.cpp \
NewGameDialog.cpp \
GameController.cpp \
Stair.cpp \
TileData.cpp \
Statistics.cpp \
StatisticsDialog.cpp \
StatisticWidget.cpp \
Level.cpp \
RandomMapGenerator.cpp \
AiController.cpp \
MonsterJournalWidget.cpp \
InventoryDialog.cpp \
PathSearch.cpp \
PathNode.cpp \
Path.cpp \
EntityDatabase.cpp \
EntityData.cpp \
Entity.cpp \
CharacterData.cpp \
main.cpp

FORMS += MainWindow.ui \
NewGameDialog.ui \
StatisticsDialog.ui \
StatisticWidget.ui \
MonsterJournalWidget.ui \
InventoryDialog.ui

RESOURCES += \
icons/icons.qrc \
tiles/tiles.qrc

RESOURCES += \
entities/entities.qrc

Моя проблема в том, что все tests проекты используют классы из app проект, что означает, что они компилируют все эти классы, даже если они уже были скомпилированы, когда app был построен. Возьмите layer тестовый проект, например:

layer.pro:

QT += testlib
QT -= gui

greaterThan(QT_MAJOR_VERSION, 4) {
QT += widgets
}

TARGET = tst_LayerTest
CONFIG += console
CONFIG -= app_bundle

TEMPLATE = app

SOURCES += tst_LayerTest.cpp
DEFINES += SRCDIR=\\\"$$PWD/\\\"
HEADERS += "../../app/Entity.h"SOURCES += "../../app/Entity.cpp"

Так как же я могу указать qmake на .o (а также qrc_, .moc и т.д.) файлы, которые уже были созданы в app? Есть ли какая-то переменная qmake для этой цели, или структура моего проекта просто принципиально несовершенна?

3

Решение

Вы можете использовать подстановочные знаки в файлах qmake .pro, чтобы избежать необходимости вести список всех имен файлов.

Например,

SOURCES += *.cpp

Каждый раз, когда вы запускаете qmake, этот шаблон *.cpp расширяется до текущего списка файлов, соответствующих шаблону.

Вы также можете использовать -= удалить имена файлов, если у вас есть конкретное имя файла, которое вы хотите исключить.

Например:

SOURCES += *.cpp
SOURCES -= main.cpp

редактировать

Я почти предложил в своем предыдущем ответе, чтобы вы представили библиотеку, используя шаблон lib qt, для хранения вашего общего кода.

Тогда ваша структура сборки будет выглядеть следующим образом — при условии, что вы можете перемещать файлы из приложения / в lib /:

game
game.pro
app
app.pro
main.cpp
lib
lib.pro
Entity.h
Entity.cpp
Entity.o
moc_Entity.cpp
moc_Entity.o
tests
layer
layer.pro
tst_Layer.cpp

Вы можете найти некоторую информацию о проектах библиотеки в «Создание библиотеки» на сайте Qt

Если по какой-то причине вы не можете перемещать свои файлы, то вы можете ввести новый каталог для библиотеки и заставить его извлекать исходные файлы из каталога приложения — но это определенно более неверно и более запутанно:

game
game.pro
app
app.pro - builds only main.o
main.cpp
Entity.h
Entity.cpp
moc_Entity.cpp
lib
lib.pro
Entity.o
moc_Entity.o
tests
layer
layer.pro
tst_Layer.cpp

Редактировать 2

Одна из ваших проблем заключается в том, что вы помещаете объектные файлы в переменную LIBS, которая определяет библиотеки, с которыми будет ссылаться ваш код. Вот почему вы получаете ошибки с этими файлами.

Попробуйте вместо этого использовать эти LIBS на ОБЪЕКТЫ, и это может сработать.

Если нет, прочитайте это нить, который просит почти то же самое.

В частности, смотрите ответ ChrisW67 «13 мая 2012 года, 10:14», который начинается;

Пытаться:

ОБЪЕКТЫ + = f1.o f2.o f3.o f3.o

хотя я думаю, что если у вас есть источник, встроить его в свой
Приложение напрямую или через библиотеку является лучшим вариантом.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]