2017-02-15 1 views
0

J'ai un projet construit avec QtCreator. Un myapp et un mylib staticlib. Les deux sont gérés dans un projet de modèle SUBDIRS.Comment appeler un Makefile externe à partir d'un fichier de projet Qt .pro

TEMPLATE = subdirs 
SUBDIRS = \ 
     mylib \ 
     myapp 

CONFIG += ordered 
CONFIG += qt 

myapp.depends = mylib 

myapp est également lié contre mylib2, statique-lib construit séparément outsideof framework Qt.

Donc, quelque part dans myapp.pro J'ai:

# Paths to PGA libs and contrib 
INCLUDEPATH += ./include 
INCLUDEPATH += $$PWD/../mylib2/include 
... 
unix { 
    LIBS += "-L$$PWD/../mylib2/lib/" -lmylib2$${DBG} # DBG=d if debug mode 
... 
} 

De cette façon, tout fonctionne bien. Je suis heureux. Mais pour que cela fonctionne, j'ai besoin de m'assurer que mylib2 est déjà construit quand je construis myapp.

Ce que je souhaite réaliser, est de faire un appel au makefile oy mylib2 quand il doit construire. c'est-à-dire make -C /path/to/mylib2 -f mylib2.mak

Que dois-je ajouter dans mon fichier .pro? Est-ce lié à des cibles personnalisées? Mais comment créer automatiquement une cible personnalisée avec la cible qmake?

Z.

+0

Créez un fichier qmake pour mylib2 et ajoutez mylib2 en tant que projet subdir. Fournir la dépendance de mylib de mylib2. Créer une cible personnalisée dans lib2: http://stackoverflow.com/questions/3776476/how-to-add-custom-targets-in-a-qmake-generated-makefile – AlexanderVX

+0

Alexander, malheureusement, je ne peux pas migrer les makefiles réguliers vers le projet qmake fichiers ... pour des raisons techniques. – Zyend

+0

Non. Je voulais dire que vous allez créer un fichier .pro qui appelle GNU makefile makefile. – AlexanderVX

Répondre

2

Peut-être que je mal compris, mais monapp dépend de mylib, mais vous construisez monapp premier. Vous avez forcé Qt à le construire ordonné, mais vous avez myapp à la première place.

Essayez de construire mylib en premier.

CONFIG += ordered 
SUBDIRS = \ 
    mylib \ # must be first 
    myapp 

Edit: Je compile libraw dans mon projet comme celui-ci

Cela peut être dans un fichier séparé comme libraw.pri et vous pouvez l'ajouter à projet app.

Commentaire: Cette solution attend la bibliothèque sur laquelle vous ne travaillez pas. Il ne se reconstruira pas lors des changements de n'importe quel fichier dans le dossier mylib2. Il sera construit sur qmake run. Pas lors de la construction de votre projet d'application ou de mylib.

# Build libraw 
!exists($$librawdir/bin/libraw.dll) { 
    system(cd $$librawdir && vcvarsall.bat amd64 && nmake Makefile.msvc) 
} 

Vous version peut ressembler à: Nom du fichier mylib2.pri

!exist (/path/to/mylib2/bin/mylib2.dll) { 
    system (make -C /path/to/mylib2 -f mylib2.mak) 
} 

Ensuite, dans votre application fichier pro, vous devez ajouter ce fichier comme

include(mylib2.pri) 

Ou vous pouvez ajouter QMAKE_POST_TARGET comme ceci dans le projet mylib qui est exécuté avant le projet myapp.

 QMAKE_POST_LINK += make -C /path/to/mylib2 -f mylib2.mak & 

Ceci devrait s'exécuter chaque fois que la cible mylib est compilée.

+0

En effet. C'est correct. – Zyend

+1

J'ai obtenu le mien pour travailler avec 'QMAKE_PRE_LINK' ... notez également que le' & 'final est d'indiquer une commande supplémentaire à exécuter. S'il n'y a qu'une seule commande dans votre QMAKE_PXXX_LINK, vous n'avez pas besoin de l'esperluette. – phyatt