46

多数の共有ライブラリにリンクするプロジェクトがあります。

プロジェクトAがプロジェクトBとCに依存しているとしましょう

理想的には、プロジェクト ファイルに次の依存関係を課したいと考えています。

  1. プロジェクト A が最後にビルドされてから B または C が再ビルドされている場合は、プロジェクト A を再ビルドします。
  2. 関連する構成の出力を使用します (つまり、プロジェクト A をデバッグ モードでビルドする場合は、プロジェクト B および C のライブラリのデバッグ バージョンを使用します)。

プロジェクトファイルでそのような依存関係を明示的に表現する方法を知っている人はいますか?

4

5 に答える 5

62

qmakeにかなりの不満を感じた後、あなたの質問に対する答えだと思うものを見つけました。そうでない場合は、より良いものが見つかるまでqmakeを使用する方法を学びました.これはまだ少し醜いからです. デモ プロジェクトをセットアップしました。これが私のディレクトリ構造です (ファイルには拡張子があり、フォルダにはありません)。

MyProj
    MyProj.pro
    myproj-core
        myproj-core.pro
        globals.h
        MyProjCore.h
        MyProjCore.cpp
    myproj-app
        myproj-app.pro
        main.cpp

私たちはプロジェクトとMyProj.proして始めます。これは、あなたが求めていることを実行するための鍵です。subdirs基本的に、他のプロジェクトに依存してデバッグ/リリースやその他のあらゆる種類のジャンクを指定するのではなく、1 つの qmake ファイルに設定するだけです。必要なものだけを作ることはできませんが、私が思いつく最善の解決策です。内容は次のとおりです。

TEMPLATE = subdirs
# Needed to ensure that things are built right, which you have to do yourself :(
CONFIG += ordered

# All the projects in your application are sub-projects of your solution
SUBDIRS = myproj-core \
          myproj-app

# Use .depends to specify that a project depends on another.
myproj-app.depends = myproj-core

myproj-core.proは、典型的な共有オブジェクト ライブラリです。

QT -= gui
TARGET = myproj-core
TEMPLATE = lib
DEFINES += MYPROJCORE_LIBRARY
SOURCES += MyProjCore.cpp
HEADERS += MyProjCore.h \
           globals.h

myproj-app.pro必要に応じて再構築する小さなトリックは次のとおりです。

QT       -= gui

TARGET = myproj-app
CONFIG   += console
CONFIG   -= app_bundle

TEMPLATE = app

# Specify that we're lookin in myproj-core.  Realistically, this should be put
# in some configuration file
INCLUDEPATH += ../myproj-core
# Link to the library generated by the project.  Could use variables or
# something here to make it more bulletproof
LIBS += ../myproj-core/libmyproj-core.so
# Specify that we depend on the library (which, logically would be implicit from
# the fact that we are linking to it)
PRE_TARGETDEPS += ../myproj-core/libmyproj-core.so

SOURCES += main.cpp

私はそれが私のものを解決したことを知っているので、これがあなたの問題を解決することを願っています!

EDIT:依存関係を構築するための特別なファイルを作成し、各プロジェクトの兄弟フォルダー(上記で指定したディレクトリ構造の MyProj の子)に保存しますdependencies.pri

# On windows, a shared object is a .dll
win32: SONAME=dll
else:  SONAME=so

# This function sets up the dependencies for libraries that are built with
# this project.  Specify the libraries you need to depend on in the variable
# DEPENDENCY_LIBRARIES and this will add
for(dep, DEPENDENCY_LIBRARIES) {
    #message($$TARGET depends on $$dep ($${DESTDIR}/$${dep}.$${SONAME}))
    LIBS += $${DESTDIR}/lib$${dep}.$${SONAME}
    PRE_TARGETDEPS += $${DESTDIR}/lib$${dep}.$${SONAME}
}

したがって、消費するすべてのアプリケーションの一番下に、次の行を追加できます。

DEPENDENCY_LIBRARIES = myproj-core

include(../config/dependencies.pri)

これは、ライブラリを共有の場所にコピーしたり、必要に応じて移動したりすることを前提としているため、私の機能が機能しない可能性がありますが、ソリューションに追加することにしました。

于 2010-03-14T08:04:50.853 に答える
10

以下のソリューションを使用します。これは、サブディレクトリ テンプレートを含む追加の .pro ファイルを使用せずに機能します。

TEMPLATE = app
TARGET = MyApp
PRE_TARGETDEPS = ../../libs/MyLib/MyLib.a
INCLUDEPATH += ../../libs/MyLib/include 
HEADERS += src/MyApp.h \
    ../../libs/MyLib/incude/MyLib.h
SOURCES += src/MyApp.cpp
LIBS += ../../libs/MyLib/MyLib.a

MyLib.target = ../../libs/MyLib/MyLib.a
MyLib.commands = cd ../../libs/MyLib && make
MyLib.depends = ../../libs/MyLib/Makefile
QMAKE_EXTRA_TARGETS += MyLib
于 2011-06-30T12:46:04.497 に答える
5
  1. この質問をチェックしてください:QTCreatorでビルドするときに強制的に再リンクします
  2. このコードに似たものをプロファイルに追加してみてください。

    CONFIG(debug, debug|release) {   
        DESTDIR = ../../../bin/debug  
        OBJECTS_DIR = ./debug  
    }  
    else {   
        DESTDIR = ../../../bin/release  
        OBJECTS_DIR = ./release  
    }
    

次に、各構成の依存関係を指定する必要があります。

CONFIG(debug, debug|release) {   
    LIBS += -L../../../lib/debug \  
        -L../../../bin/debug \  
        -llib1 \  
        -llib2   
    PRE_TARGETDEPS += ../../../lib/debug/liblib1.a \  
        ../../../lib/debug/liblib2.a 
else { 
    LIBS += -L../../../lib/release \
        -L../../../bin/release \
        -llib1 \  
        -llib2   
    PRE_TARGETDEPS += ../../../lib/release/liblib1.a \
        ../../../lib/release/liblib2.a 
}
于 2010-02-18T14:51:32.337 に答える
1

新しい DLL (pqXDot) を再利用可能なクラス (pqGraphviz から) に移動した後、プロジェクトをリファクタリングするときにこの問題が発生しました。

プロジェクトに新しい DLL を追加し、それを必要とする他の DLL およびアプリケーションへの新しい DLL 参照を追加した後、メイン .pro に次のものがありました。

TEMPLATE = subdirs

SUBDIRS += \
    pqConsole \
    pqConsoleTest \
    pqSource \
    pqSourceTest \
    fdqueens \
    pqGraphviz \
    pqGraphvizTest \
    pqXDot

再構築中の DLL である pqGraphviz が新しい DLL である pqXDot を見つけられないため、再構築によってリンカー エラーが発生しました。

必要な DLL を依存する DLL の前に移動して、SUBDIRS リストを並べ替えるだけで十分であることがわかりました。

SUBDIRS += \
    pqConsole \
    pqConsoleTest \
    pqSource \
    pqSourceTest \
    fdqueens \
    pqXDot \
    pqGraphviz \
    pqGraphvizTest
于 2013-10-06T08:40:18.973 に答える