2012-08-23 36 views
1

我已经用QT创建者创建了一个项目,并且我已经手动修改了qmakefile。问题在于,当我修改某些内容时,我需要两次构建项目,因为第一次有一些后链接复制问题。第一次编译输出称,在编译结束时(即成功结束):项目需要编译两次以复制文件

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 

,而第二次是正确编译,我已经没有这个问题。

我的makefile就像下面

# 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 

我认为复制问题,是因为这个部分,我复制给我的输出问题的文件中涉及到本节

# 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}) 
    } 
} 

。所有目录都存在。那么我在哪里错了,我该如何纠正它,以便在第一个构建步骤中正确复制文件?

在此先感谢您的答复。

回答

2

如果我没有错,任何由DESTDIR指定的目录都将被创建,如果它尚不存在。另一方面,在目标链接结束后,您无法确定发生了这种情况。

所以,你应该添加

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

先创建目标目录,并在成功复制。

编辑:有一个错误。如果没有像& &这样的逻辑命令操作符(使用更合适的),它会将以下命令视为 参数mkdir

+0

我刚刚做完了,但没有任何反应。编译器添加一个警告,告诉它不能创建目录,因为它已经存在。 mkdir:无法创建目录'../../../configuration/options.xml':存在文件 mkdir:无法创建目录'/usr/lib/awframework/Debug/libMyFramework.so':文件存在 mkdir:无法创建目录'/usr/lib/awframework/Debug/libMyFrameworkRoutines.so':文件存在 – Jepessen

+0

看到我编辑的代码 – UmNyobe

+0

它的工作原理,谢谢!对您的解决方案进行的唯一修改是编写'QMAKE_POST_LINK + = mkdir -p $$ {DESTINATION_PATH}'而不是'QMAKE_POST_LINK = mkdir -p $$ {DESTINATION_PATH}' – Jepessen