使用带qmake的子目录结构避免重复的目标文件

时间:2012-12-09 13:10:26

标签: c++ qt project qmake object-files

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

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项目中的类,这意味着他们正在编译所有这些类,即使它们已经在{{1}时编译过了} 被建。参加app测试项目,例如:

layer.pro:

layer

那么如何将qmake指向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" 中已生成的.o(以及qrc_.moc等)文件?为此目的是否有一些qmake变量,或者我的项目结构是否存在根本缺陷?

1 个答案:

答案 0 :(得分: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

您可以在"Building a Library" on the Qt website

中找到有关图书馆项目的一些信息

如果出于某种原因,你无法移动你的文件,那么你可以为这个库引入一个新的目录,并让它从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,它可能会有效。

如果没有,请阅读此thread,这几乎要求同样的事情。

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

  

尝试:

     

OBJECTS + = f1.o f2.o f3.o f3.o

     

虽然我认为,如果你有源,建立它你的   应用程序直接或通过库是一个更好的选择。