У меня есть игра с двумя отдельными проектами для самого приложения и тестов. Я строю все проекты в исходном коде. Вот сокращенная версия структуры моего проекта:
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 для этой цели, или структура моего проекта просто принципиально несовершенна?
Вы можете использовать подстановочные знаки в файлах 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
хотя я думаю, что если у вас есть источник, встроить его в свой
Приложение напрямую или через библиотеку является лучшим вариантом.
Других решений пока нет …