Quelle est la meilleure façon de référencer les bibliothèques dans des projets Qt?
-
03-10-2019 - |
Question
J'ai deux projets Qt4 et une application GUI bibliothèque partagée projet, tous référencé dans un fichier .pro avec le modèle « de subdirs ». Donc, il est comme:
- exampleapp.pro
- app1.pro
- app2.pro
- sharedlib.pro
Maintenant, ce que je veux faire est sharedlib de référence de app1 et App2 afin que chaque fois que je lance app1.exe, je ne pas copier manuellement sharedlib.dll de son propre dossier dans le dossier de app1.exe.
Je pourrais définir la variable d'environnement PATH dans la fenêtre de projets, mais ce n'est pas très portable. Je l'ai regardé à mettre la variable LIBS dans le fichier app1.pro, mais je ne suis pas sûr si cela fait référence aux bibliothèques liées statiquement seulement - je l'ai essayé avec plusieurs syntaxes et il ne semble pas travailler avec libs partagées .
La solution
Vous pouvez organiser votre projet comme suit:
- Projet1
-
bin
- lib
- app1
- app2.pro
- App2
- app2.pro
- sharedlib
- sharedlib.pro
sharedlib.pro peut ajouter quelque chose comme ceci:
TEMPLATE = lib
TARGET = sharedlibr
QT + = core \
gui
DESTDIR = .. / lib
DESTDIR: garantit que le résultat de la compilation sera copié à l'emplacement ".. / lib"
comme pour les applications App1 et App2:
TEMPLATE = app
TARGET = app1
QT + = core \
gui
DESTDIR = .. / bin
ce que pour le développement, lors de la création du programme d'installation, les bibliothèques et les exécutables sont placés dans les dirs appropriés, en fonction du système d'exploitation.
Autres conseils
Pour ajouter à cela (un peu en retard!), On peut utiliser QMAKE_POST_LINK
pour copier des fichiers autour après la construction est terminée. Exemple:
defineReplace(formatpath) {
path = $$1
win32 {
return(\"$$replace(path, "/", "\\")\")
} else:unix {
return($$replace(path, " ", "\\ "))
} else {
error("Unknown platform in formatpath!")
}
}
win32:COPY_CMD = copy
unix:COPY_CMD = cp -P
macx:COPY_CMD = cp -R
win32:CMD_SEP = $$escape_expand(\n\t)
unix:CMD_SEP = ";"
win32:LIB_EXT = dll
unix:LIB_EXT = so*
macx:LIB_EXT = dylib
# Put here the directory of your library's build dir, relative to the current directory
# A path is given for example...
MYLIB_BUILD_DIR = $$_PRO_FILE_PWD_/../lib/bin
QMAKE_POST_LINK += $$COPY_CMD $$formatpath($$MYLIB_BUILD_DIR/*.$$LIB_EXT) $$formatpath($$OUT_PWD/$$DESTDIR) $$CMD_SEP