3

アプリケーション自体とテスト用に 2 つの個別のプロジェクトを持つゲームがあります。すべてのプロジェクトをインソースでビルドしています。私のプロジェクト構造の短縮版は次のとおりです。

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ていることです。つまり、ビルド時に既にコンパイルされていても、これらのクラスをすべてコンパイルしていますapplayerたとえば、テスト プロジェクトを考えてみましょう。

レイヤー.プロ:

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(およびなど) ファイルを参照するにはどうすればよいでしょうか。この目的のためのqmake変数はありますか、それとも私のプロジェクト構造に根本的な欠陥がありますか?qrc_.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 Web サイトの「Building a Library」にあります。

なんらかの理由でファイルを移動できない場合は、ライブラリに新しいディレクトリを導入し、アプリ ディレクトリからソース ファイルを取得することができますが、これは間違いなく面倒で混乱を招きます。

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

問題の 1 つは、コードがリンクするライブラリを定義する LIBS 変数にオブジェクト ファイルを入れていることです。そのため、これらのファイルでエラーが発生します。

代わりに、これらの LIBS の使用を OBJECTS に変更してみてください。

そうでない場合は、ほとんど同じことを求めているこのスレッドを読んでください。

特に、「2012 年 5 月 13 日 10:14」に始まる ChrisW67 による回答を参照してください。

試す:

オブジェクト += f1.o f2.o f3.o f3.o

ただし、ソースがある場合は、アプリに直接ビルドするか、ライブラリを介してビルドすることをお勧めします。

于 2012-12-09T18:11:59.590 に答える