2010-02-18 11 views
42

J'ai un projet qui lie à un certain nombre de bibliothèques partagées.Dépendances du projet Qmake (bibliothèques liées)

Disons que le projet A dépend des projets B et C

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

  1. Reconstruire le projet A si B ou C a été reconstruit depuis dernier projet a été construit le temps A
  2. utilisez la sortie pour la configuration correspondante (à savoir si le projet de construction d'un en mode débogage, puis utilisez les versions de débogage des libs pour le projet B et C)

Est-ce que quelqu'un sait comment je peux explicitement exprimer de telles dépendances dans mon fichier de projet?

Répondre

5
  1. Vérifiez cette question: Force relink when building in QT Creator
  2. Essayez d'ajouter quelque chose de similaire à ce code à votre fichier pro:

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

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

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 
} 
58

Après tout ab de frustration avec qmake, j'ai trouvé ce que je pense être la réponse à votre question. Sinon, j'ai appris comment j'utiliserai qmake jusqu'à ce que je trouve quelque chose de mieux, parce que c'est encore un peu moche. Je mis en place un projet de démonstration, c'est ma structure de répertoires (fichiers ont des extensions, des dossiers ne le font 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 par MyProj.pro comme un projet subdirs, qui est la clé pour faire ce que vous demandez. Fondamentalement, au lieu de dépendre d'autres projets pour spécifier le débogage/lancement et toutes sortes d'autres indésirables, il suffit de le définir sur le fichier qmake. Cela ne vous permet pas seulement de faire ce dont vous avez besoin, mais c'est la meilleure solution que je pourrais trouver. 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 votre bibliothèque d'objets partagés typique:

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

myproj-app.pro est une application à la consommation, où le petit truc reconstruire-quand besoin 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, car je sais qu'il a résolu le mien!

EDIT: J'ai fait un fichier spécialement pour la construction des dépendances pour moi, je stocker dans un dossier de frères et soeurs de chacun de mes projets (enfants de la MyProj dans la structure de répertoire spécifié ci-dessus) appelé 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 fond de toutes les applications de consommation, je peux ajouter les lignes:

DEPENDENCY_LIBRARIES = myproj-core 

include(../config/dependencies.pri) 

Cela suppose que vous copiez les bibliothèques vers un emplacement partagé et/ou le déplacement e em autour comme nécessaire, donc ma fonction pourrait ne pas fonctionner pour vous, mais je me suis dit que je l'ajouterais à la solution.

+0

Hi Travis, Pourriez-vous s'il vous plaît poster les fichiers source de votre projet? Je suis sûr que plusieurs personnes apprécieront cela et utiliseront le projet comme modèle pour leur application. – lucab0ni

+0

Ce serait génial d'avoir les fichiers sources. :) – Marcello90

+1

Vous pouvez utiliser 'QMAKE_EXTENSION_SHLIB' au lieu d'essayer de configurer' SONAME' manuellement - en bonus, cela fonctionnera aussi sur Mac OS X (qui utilise 'dylib' comme extension). – ashkulz

7

J'utilise la solution ci-dessous. Cela fonctionne sans l'utilisation d'un fichier .pro supplémentaire avec le 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 
+2

C'est génial si votre bibliothèque n'est pas un projet qmake. Merci! – Patrick

1

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

Après avoir ajouté une nouvelle DLL à mon projet, et en ajoutant la nouvelle référence DLL à d'autres DLL et les applications qui en ont besoin, j'avais dans la principale .pro:

TEMPLATE = subdirs 

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

et la recréation a provoqué une erreur de liaison, car pqGraphviz, la DLL en cours de restructuration, ne peut pas trouver pqXDot, la nouvelle DLL.

Il se trouve qu'il est suffisant pour réorganiser la liste des SUBDIRS, le déplacement de la DLL nécessaire avant que l'une personne à charge:

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

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