2012-08-23 3 views
1

J'ai créé un projet avec QT creator et j'ai modifié manuellement le fichier qmakefile. Le problème est que, quand je modifie quelque chose, j'ai besoin de construire le projet deux fois parce que la première fois que j'ai un problème de copie post-lien. La première fois que la sortie de la compilation dit, à la fin de la compilation (qui se termine avec succès):Le projet doit être compilé deux fois pour copier les fichiers

cp ../../../configuration/options.xml ../../../bin cp /usr/lib/MyFramework/Debug/libMyFramework.so ../../../bin cp /usr/lib/MyFramework/Debug/libMyFrameworkRoutines.so ../../../bin 
cp: omitting directory `../../../bin' 
cp: cannot stat `cp': No such file or directory 
cp: omitting directory `../../../bin' 
cp: cannot stat `cp': No such file or directory 

alors que la deuxième fois, il compile correctement et je ne l'ai pas ce problème.

Mon makefile est comme ce qui suit

# Variables used in the project 
SOURCES_PATH  = $$quote(../../../src/UpdateManager/sources) 
HEADERS_PATH  = $$quote(../../../src/UpdateManager/headers) 
DESTINATION_PATH = $$quote(../../../bin) 

# Project configuration 
QT  -= gui 
TARGET = UpdateManager 
TEMPLATE = lib 
DEFINES += UPDATEMANAGER_LIBRARY 

# Copying to destination folder 
DESTDIR = $$DESTINATION_PATH 

# Headers paths used in the project 
INCLUDEPATH += $$HEADERS_PATH 

# Source files 
SOURCES += \ 
    ../../../src/UpdateManager/sources/options.cpp \ 
    ../../../src/UpdateManager/sources/consolelog.cpp \ 
    ../../../src/UpdateManager/sources/updatemanager.cpp 

HEADERS += \ 
    ../../../src/UpdateManager/headers/options.h \ 
    ../../../src/UpdateManager/headers/consolelog.h \ 
    ../../../src/UpdateManager/headers/updatemanager.h 

OTHER_FILES += \ 
    ../../../configuration/options.xml 

unix:!symbian { 
    maemo5 { 
     target.path = /opt/usr/lib 
    } else { 
     target.path = /usr/lib 
    } 
    INSTALLS += target 
} 

### EXTERNAL LIBRARIES ### 

# my framework 
MY_FRAMEWORK_HEADERS_PATH = $$quote(/usr/include/MyFramerork/) 
MY_FRAMEWORK_LIBRARY_PATH = $$quote(/usr/lib/MyFramerork) 
MY_FRAMEWORK_ROUTINES_HEADERS_PATH = $$quote(/usr/include/MyFramerork/routines) 

INCLUDEPATH += $$MY_FRAMEWORK_HEADERS_PATH 
INCLUDEPATH += $$MY_FRAMEWORK_ROUTINES_HEADERS_PATH 

LIBS += -L$$MY_FRAMEWORK_LIBRARY_PATH/Debug/ -lMyFramework 
LIBS += -L$$MY_FRAMEWORK_LIBRARY_PATH/Debug/ -lMyFrameworkRoutines 

# Copying needed files in out directory 
unix{ 
    EXTERNAL_FILES += \ 
    ../../../configuration/options.xml \ 
    $$MY_FRAMEWORK_LIBRARY_PATH/Debug/libMyFramework.so \ 
    $$MY_FRAMEWORK_LIBRARY_PATH/Debug/libMyFrameworkRoutines.so 

    for(FILE,EXTERNAL_FILES){ 
    QMAKE_POST_LINK += $$quote(cp $${FILE} $${DESTDIR}) 
    } 
} 

# Boost 
LIBS += -lboost_thread 

Je pense que le problème de la copie est liée à cette section

# Copying needed files in out directory 
unix{ 
    EXTERNAL_FILES += \ 
    ../../../configuration/options.xml \ 
    $$MY_FRAMEWORK_LIBRARY_PATH/Debug/libMyFramework.so \ 
    $$MY_FRAMEWORK_LIBRARY_PATH/Debug/libMyFrameworkRoutines.so 

    for(FILE,EXTERNAL_FILES){ 
    QMAKE_POST_LINK += $$quote(cp $${FILE} $${DESTDIR}) 
    } 
} 

Parce que dans cette section, je copier des fichiers qui me donnent problème dans la sortie. Tout le répertoire existe. Alors, où ai-je tort et comment puis-je le corriger afin que les fichiers soient copiés correctement dans la première étape de construction?

Merci d'avance pour vos réponses.

Répondre

2

Si je ne me trompe pas, tout répertoire spécifié par DESTDIR sera créé s'il n'existe pas déjà. D'un autre côté, vous ne pouvez pas être sûr que cela se produira après la fin de la liaison de la cible.

Vous devez ajouter

QMAKE_POST_LINK += mkdir -p $${DESTINATION_PATH} 
for(FILE,EXTERNAL_FILES){ 
    QMAKE_POST_LINK += && $$quote(cp $${FILE} $${DESTDIR}) 
} 

pour créer le répertoire cible premier et copier sur le succès.

EDITED: Une erreur s'est produite. Sans un opérateur de commande logique comme & & (utilisez ce qui est plus approprié), il considère les commandes suivantes comme arguments de mkdir.

+0

Je viens de le faire, mais rien ne se passe. Le compilateur ajoute un avertissement indiquant qu'il ne peut pas créer de répertoire car il existe déjà. mkdir: impossible de créer le répertoire '../../../configuration/options.xml ': le fichier existe mkdir: impossible de créer le répertoire' /usr/lib/awframework/Debug/libMyFramework.so': le fichier existe mkdir: impossible de créer le répertoire '/usr/lib/awframework/Debug/libMyFrameworkRoutines.so ': Le fichier existe – Jepessen

+0

voir mon code édité – UmNyobe

+0

Cela fonctionne, merci! La seule modification apportée à votre solution consistait à écrire 'QMAKE_POST_LINK + = mkdir -p $$ {DESTINATION_PATH}' au lieu de 'QMAKE_POST_LINK = mkdir -p $$ {DESTINATION_PATH}' – Jepessen

Questions connexes