31 votes

Qmake dépendances du projet (bibliothèques liées)

J'ai un projet qui est lié à un certain nombre de bibliothèques partagées.

Disons Un projet dépend des projets B et C

Idéalement, je veux imposer les dépendances suivantes dans mon dossier de projet:

  1. Projet de reconstruction de A si B ou C a été reconstruit depuis la dernière fois où Un projet a été construit
  2. L'utilisation de la sortie pour la configuration (c'est à dire si le projet de construction d'Un dans le debug mode, puis utilisez les versions de débogage de la libs pour le projet B et C)

Personne ne sait comment je peut exprimer explicitement de telles dépendances dans mon fichier de projet?

47voto

Travis Gockel Points 11043

Après un peu de frustration avec qmake, j'ai trouvé ce que je pense est la réponse à votre question. Si non, alors j'ai appris la façon dont je vais l'utiliser qmake jusqu'à ce que je trouve quelque chose de mieux, parce que c'est encore un peu laid. J'ai mis en place un projet de démonstration, c'est ma structure de répertoire (fichiers ont des extensions, les dossiers ne sont pas):

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

Nous commençons avec MyProj.pro comme subdirs du projet, qui est la clé pour faire ce que vous demandez. En gros, au lieu de dépendre d'autres projets pour spécifier debug/release et toutes autres sortes de cochonneries, vous venez de le mettre sur l'un qmake fichier. Il ne vous laisse pas faire uniquement ce dont vous avez besoin, mais c'est la meilleure solution que je pouvais venir. Voici le contenu:

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 est typique de votre shared object library:

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

myproj-app.pro des consommateurs de l'application, d'où le peu de reconstruire quand nécessaire truc, c'est:

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

J'espère que cela résout votre problème, comme je sais qu'il a résolu le mien!

EDIT: j'ai fait un fichier spécialement pour la construction de dépendances pour moi, je le stocker dans un frère ou une sœur de dossier de chacun de mes projets (enfant de la MyProj dans la structure de répertoire spécifié ci-dessus) appelés 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}
}

Donc, au bas de toutes les applications qui consomment beaucoup, je peux ajouter les lignes:

DEPENDENCY_LIBRARIES = myproj-core

include(../config/dependencies.pri)

Cela suppose que vous copiez les bibliothèques de certains emplacement partagé et/ou de les déplacer comme nécessaire, donc ma fonction peut ne pas fonctionner pour vous, mais j'ai pensé que je voudrais ajouter à la solution.

6voto

Jeroen Points 63

J'utilise la solution ci-dessous. Cela fonctionne sans l'utilisation d'un fichier .pro supplémentaire avec un modèle de sous-répertoire.

 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
 

5voto

rpg Points 5305
  1. Consultez cette question: http://stackoverflow.com/questions/1485435/force-relink-when-building-in-qt-creator
  2. Essayez d'ajouter quelque chose de similaire à ce code dans votre fichier pro:
    CONFIG(debug, debug|release) {

Ensuite, vous devrez spécifier les dépendances pour chaque configuration:

 

0voto

CapelliC Points 30055

J'ai eu ce problème lors d'un refactoring mon projet, après j'ai déménagé dans une nouvelle DLL (pqXDot) une classe réutilisable (à partir de pqGraphviz).

Après l'ajout d'une nouvelle DLL à mon projet, et l'ajout de la nouvelle DLL référence à d'autres DLL et les applications qui en avait bien besoin, j'ai eu en main .pro:

TEMPLATE = subdirs

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

et la reconstruction a provoqué une erreur de l'éditeur de liens, parce que pqGraphviz, la DLL en cours de restructuration, ne peut pas trouver pqXDot, la nouvelle DLL.

Il s'avère que c'est suffisant pour réorganiser les sous-dossiers de la liste, le déplacement de la DLL requis avant de la variable dépendante:

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

0voto

imx51 Points 363

Pour ceux qui sont intéressés par un modèle pour votre projet Qt / QML, j'ai publié un modèle sur GitHub QmlAppTemplate .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X