quimica - qt tutorial
Dependencias del proyecto Qmake(bibliotecas vinculadas) (5)
- Mira esta pregunta: Force relink al construir en QT Creator
Intente agregar algo similar a este código a su archivo pro:
CONFIG(debug, debug|release) { DESTDIR = ../../../bin/debug OBJECTS_DIR = ./debug } else { DESTDIR = ../../../bin/release OBJECTS_DIR = ./release }
Luego deberá 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
}
Tengo un proyecto que enlaza con una cantidad de bibliotecas compartidas.
Digamos que el proyecto A depende de los proyectos B y C
Idealmente, quiero imponer las siguientes dependencias en mi archivo de proyecto:
- Reconstruye el proyecto A si B o C han sido reconstruidos desde la última vez que se construyó el proyecto A
- Use la salida para la configuración relevante (es decir, si construye el proyecto A en modo de depuración, luego use las versiones de depuración de las libs para los proyectos B y C)
¿Alguien sabe cómo puedo expresar explícitamente tales dependencias en mi archivo de proyecto?
Después de un poco 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. Configuré un proyecto de demostración, esta es mi estructura de directorios (los archivos tienen extensiones, las carpetas no):
MyProj
MyProj.pro
myproj-core
myproj-core.pro
globals.h
MyProjCore.h
MyProjCore.cpp
myproj-app
myproj-app.pro
main.cpp
Comenzamos con MyProj.pro
como un proyecto de subdirs
, que es la clave para hacer lo que pide. 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. Aquí están 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 una aplicación para el consumidor, donde el pequeño truco de reconstrucción cuando es 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 crear las dependencias para mí, lo guardo en una carpeta de hermanos de cada uno de mis proyectos (hijo de MyProj en la estructura de directorios especificada anteriormente) llamado 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}
}
Entonces, en la parte inferior de todas las aplicaciones consumidoras, puedo agregar las líneas:
DEPENDENCY_LIBRARIES = myproj-core
include(../config/dependencies.pri)
Esto supone que está copiando las bibliotecas en alguna ubicación compartida y / o moviéndolas según sea necesario, por lo que es posible que mi función no funcione para usted, pero pensé que la agregaría a la solución.
Para aquellos que están interesados en una plantilla para su proyecto Qt / QML, he publicado una plantilla en GitHub QmlAppTemplate .
Tuve este problema cuando refactoricé mi proyecto, después de moverme en una nueva DLL (pqXDot) una clase reutilizable (de pqGraphviz).
Después de agregar una nueva DLL a mi proyecto y agregar la nueva referencia de DLL a otras DLL y aplicaciones que lo necesitaban, tuve en .pro principal:
TEMPLATE = subdirs
SUBDIRS += /
pqConsole /
pqConsoleTest /
pqSource /
pqSourceTest /
fdqueens /
pqGraphviz /
pqGraphvizTest /
pqXDot
y la reconstrucción provocó un error del enlazador, porque pqGraphviz, la DLL que se está reestructurando, no puede encontrar pqXDot, la nueva DLL.
Resulta que es suficiente reordenar la lista SUBDIRS, moviendo la DLL requerida antes que la dependiente:
SUBDIRS += /
pqConsole /
pqConsoleTest /
pqSource /
pqSourceTest /
fdqueens /
pqXDot /
pqGraphviz /
pqGraphvizTest
Yo uso 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