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.
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
Ce serait génial d'avoir les fichiers sources. :) – Marcello90
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