Después de bastante ab de frustración con qmake, he encontrado lo que creo que es la respuesta a su pregunta. Si no, entonces he aprendido la forma en que usaré qmake hasta que encuentre algo mejor, porque esto todavía es un poco feo. He creado un proyecto de demostración, este es mi estructura de directorios (archivos tienen extensiones, carpetas no lo hacen):
MyProj
MyProj.pro
myproj-core
myproj-core.pro
globals.h
MyProjCore.h
MyProjCore.cpp
myproj-app
myproj-app.pro
main.cpp
empezamos con MyProj.pro
como un proyecto subdirs
, que es la clave para hacer lo que se le pregunte. Básicamente, en lugar de depender de otros proyectos para especificar depurar/liberar y todo tipo de otros elementos no deseados, simplemente configúralo en el único archivo qmake. No le permite hacer solo lo que necesita, pero es la mejor solución que podría encontrar. Estos son los contenidos:
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
es su típica biblioteca de objetos compartidos:
QT -= gui
TARGET = myproj-core
TEMPLATE = lib
DEFINES += MYPROJCORE_LIBRARY
SOURCES += MyProjCore.cpp
HEADERS += MyProjCore.h \
globals.h
myproj-app.pro
es aplicación de consumo, donde el pequeño truco reconstruir-cuando sea necesario-es:
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
¡Espero que esto resuelva tu problema, ya que sé que resolvió el mío!
EDITAR: Hice un archivo específicamente para la construcción de las dependencias para mí, la almacena en una carpeta de hermanos de cada uno de mis proyectos (hijo del MyProj en la estructura del directorio especificado anteriormente) llamó 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}
}
Así que en la parte inferior de todas las aplicaciones que consumen, puedo añadir las líneas:
DEPENDENCY_LIBRARIES = myproj-core
include(../config/dependencies.pri)
Esto supone que va a copiar las bibliotecas en cierta ubicación compartida y/o en movimiento º si es necesario, por lo que es posible que mi función no funcione para usted, pero pensé que la agregaría a la solución.
Hola Travis, ¿Podría publicar los archivos fuente de su proyecto? Estoy seguro de que muchas personas apreciarán eso y usarán el proyecto como plantilla para su aplicación. – lucab0ni
Sería genial tener los archivos fuente. :) – Marcello90
Puede usar 'QMAKE_EXTENSION_SHLIB' en lugar de intentar configurar' SONAME' manualmente - como una ventaja, también funcionará en Mac OS X (que usa 'dylib' como la extensión). – ashkulz