2010-02-18 18 views
42

Tengo un proyecto que enlaza con varias bibliotecas compartidas.Dependencias del proyecto Qmake (bibliotecas vinculadas)

permite decir proyecto A depende de los proyectos B y C

Lo ideal es que quieren imponer las siguientes dependencias en mi archivo de proyecto:

  1. proyecto de reconstrucción A si B o C se ha reconstruido desde proyecto última vez que un fue construido
  2. usar la salida para la configuración relevante (es decir, si proyecto de construcción a en el modo de depuración, a continuación, utilizar las versiones de depuración de los libs para proyecto B y C)

¿Alguien sabe cómo puedo expresar explícitamente tales dependencias en mi archivo de proyecto?

Respuesta

5
  1. Salida esta pregunta: Force relink when building in QT Creator
  2. Trate de añadir algo similar a este código a su favor archivo:

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

A continuación, tendrá que especificar las dependencias para cada configuración:

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

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.

+0

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

+0

Sería genial tener los archivos fuente. :) – Marcello90

+1

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

7

Utilizo la solución a continuación. Esto funciona sin el uso de un archivo .pro adicional con plantilla de subdirectorio.

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

Esto es genial si su biblioteca no es un proyecto de qmake. ¡Gracias! – Patrick

1

he tenido este problema al refactorizar mi proyecto, después de que me fui a vivir una nueva DLL (pqXDot) una clase reutilizable (de pqGraphviz).

Después de añadir un nuevo archivo DLL para mi proyecto, y la adición de la nueva referencia a otros DLL DLL y aplicaciones que lo necesiten, que tenía en .pro principal:

TEMPLATE = subdirs 

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

y el Reconstruir provocó un error de vinculador, porque pqGraphviz, la DLL que se está reestructurando, no puede encontrar pqXDot, la nueva DLL.

Resulta que es suficiente para reordenar la lista SUBDIRS, moviendo el archivo DLL requerido antes de que el dependiente de una:

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

Para aquellos que están interesados ​​en una plantilla para su proyecto Qt/QML, he publicado una plantilla en GitHub QmlAppTemplate.

Cuestiones relacionadas