1

QTクリエーターでプロジェクトを作成し、qmakefileを手動で変更しました。問題は、何かを変更するときに、最初にリンク後のコピーの問題が発生したため、プロジェクトを 2 回ビルドする必要があることです。コンパイル出力が最初に言うとき、コンパイルの最後に (それは正常に終了します):

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

2回目は正しくコンパイルされ、この問題はありません。

私の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})
  }
}

このセクションでは、出力で問題が発生するファイルをコピーするためです。すべてのディレクトリが存在します。では、どこが間違っていて、最初のビルドステップでファイルが正しくコピーされるように修正するにはどうすればよいですか?

返信ありがとうございます。

4

1 に答える 1

2

私が間違っていなければ、指定されたディレクトリDESTDIRがまだ存在しない場合は作成されます。一方、ターゲットのリンクが終了した後にこれが発生することを確認することはできません。

したがって、追加する必要があります

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

最初にターゲットディレクトリを作成し、成功したらコピーします。

編集:間違いがありました。&& のような論理コマンド演算子がない場合 (より適切なものを使用してください)、次のコマンドを の引数と見なしますmkdir

于 2012-08-23T10:24:05.490 に答える