いくつかの共有ライブラリにリンクするプロジェクトがあります。
プロジェクトAがプロジェクトBとCに依存しているとしましょう
理想的には、プロジェクトファイルに次の依存関係を課します。
私のプロジェクトファイルでそのような依存関係を明示的に表現する方法を知っている人はいますか?
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)
これは、ライブラリを共有場所にコピーしたり、必要に応じてライブラリを移動したりすることを前提としているため、私の機能が機能しない可能性がありますが、ソリューションに追加すると考えました。
以下のソリューションを使用します。これは、subdirテンプレートで追加の.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
このコードに似たものをプロファイルに追加してみてください。
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
}
新しいDLL(pqXDot))再利用可能なクラス(pqGraphvizから)に移動した後、プロジェクトをリファクタリングするときにこの問題が発生しました。
新しいDLL=をプロジェクトに追加し、新しいDLL他への参照DLLおよびそれを必要とするアプリケーションを追加した後、メインの.proにありました:
TEMPLATE = subdirs
SUBDIRS += \
pqConsole \
pqConsoleTest \
pqSource \
pqSourceTest \
fdqueens \
pqGraphviz \
pqGraphvizTest \
pqXDot
再構築によりリンカエラーが発生しました。これは、pqGraphviz(DLL再構築中)が新しいDLLであるpqXDotを見つけられないためです。
必要なDLLを依存するリストの前に移動して、SUBDIRSリストを並べ替えるだけで十分であることがわかります。
SUBDIRS += \
pqConsole \
pqConsoleTest \
pqSource \
pqSourceTest \
fdqueens \
pqXDot \
pqGraphviz \
pqGraphvizTest
Qt/QMLプロジェクトのテンプレートに興味がある人のために、GitHub QmlAppTemplate で1つのテンプレートを公開しました。