3

我有一个游戏,有两个单独的项目,用于应用程序本身和测试。我正在源代码中构建所有项目。这是我的项目结构的缩短版本:

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

应用程序专业版:

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测试项目为例:

层.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_等)文件?为此目的是否有一些 qmake 变量,或者我的项目结构是否存在根本缺陷?.mocapp

4

1 回答 1

2

您可以在 qmake .pro 文件中使用通配符,以节省维护所有文件名列表的麻烦。

例如,

SOURCES += *.cpp

每次运行 qmake 时,该模式*.cpp都会扩展为与该模式匹配的当前文件列表。

-=如果您有要排除的特定文件名,您还可以使用删除文件名。

例如:

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

编辑

我几乎在我之前的回答中建议您使用 qt 的 lib 模板引入一个库来包含您的公共代码。

然后您的构建结构将如下所示 - 假设您可以将文件从 app/ 移动到 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 网站的“构建库”中找到有关库项目的一些信息

如果由于某种原因,您无法移动文件,那么您可以为库引入一个新目录,并让它从 app 目录中拉取源文件 - 但这肯定更荒谬,更令人困惑:

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 使用改为 OBJECTS,它可能会起作用。

如果没有,请阅读这个线程,它的要求几乎相同。

特别是,请参阅“2012 年 5 月 13 日 10:14”的 ChrisW67 的回答,该回答开始了;

尝试:

对象 += f1.o f2.o f3.o f3.o

尽管我认为,如果您有源代码,直接或通过库将其构建到您的应用程序中是一个更好的选择。

于 2012-12-09T18:11:59.590 回答