Skopiuj plik do katalogu budowania po skompilowaniu projektu z Qt

Widziałem kilka sugestii, ale nic tak naprawdę nie działało dla mnie tak, jak chcę. Muszę tylko skopiować plik do wybranego katalogu docelowego.

Powiedzmy na przykład z ta odpowiedź :

install_it.path = %{buildDir}
install_it.files += %{sourceDir}/settings.ini

INSTALLS += install_it

Zmienne %{buildDir} i %{sourceDir} powinny być zdefiniowane, aby to działało. Ok, nie ma problemu z %{sourceDir}: jest po prostu .. Ale jak Mogę dostać %{buildDir}?

EDIT1

Powiedz, mam projekt my_project tutaj:

/path/to/my_project

Więc ścieżka budowania release jest taka: /path/to/my_project-build-Desktop-release,

Ścieżka budowania debugowania jest następująca: /path/to/my_project-build-Desktop-debug

Mam pliki do skopiowania do katalogu docelowego tutaj: /path/to/my_project/copy_to_install_dir

Tak więc chcę, aby wszystkie pliki z /path/to/my_project/copy_to_install_dir zostały skopiowane do /path/to/my_project-build-Desktop-release kiedy wykonam release build. I, w ten sam sposób dla debug build.

Nie mogę znaleźć zmiennej, która zawiera pełną ścieżkę docelową, tzn. /path/to/my_project-build-Desktop-release dla debug build.

Na wszelki wypadek: używam Windowsa, ale i tak Szukam rozwiązanie wieloplatformowe.

EDIT2

Dokładne rozwiązanie dla przyszłych czytelników:

install_it.path = $$OUT_PWD
install_it.files = copy_to_install_dir/*

INSTALLS += \
    install_it
 35
Author: Cœur, 2013-09-28

6 answers

Tego używamy w QtSerialPort:

target_headers.files  = $$PUBLIC_HEADERS
target_headers.path   = $$[QT_INSTALL_HEADERS]/QtSerialPort
INSTALLS              += target_headers

mkspecs_features.files    = $$QTSERIALPORT_PROJECT_ROOT/src/serialport/qt4support/serialport.prf
mkspecs_features.path     = $$[QT_INSTALL_DATA]/mkspecs/features
INSTALLS                  += mkspecs_features

Zasadniczo ustawiasz pliki i ścieżkę dla celu, a następnie dodajesz je do zmiennej INSTALLS. Nadal potrzebna jest zmienna $$OUT_PWD, której używamy również szeroko w QtSerialPort. To zapewni Ci główny katalog budowania.

Jest to jedna z tych nieudokumentowanych funkcji qmake, ale jest bardzo przydatna.

Również, dla katalogu źródłowego w ogóle, nie powinieneś zakładać "."i tak dalej ponieważ może być inaczej, gdy uruchamiasz aplikację wrapper, w której"."wskaże to, a nie to, czego oczekujesz: korzeń qmake source project. W takich przypadkach bezpieczniej jest użyć zmiennej PWD, która wskazuje na źródło, a nie OUT_PWD, która wskazuje na folder budowania.

Aby dać przybliżony przykład na temat różnicy tych dwóch zmiennych ze scenariuszem w świecie rzeczywistym, tutaj możesz znaleźć to, co robimy w QtSerialPort:

system("echo QTSERIALPORT_PROJECT_ROOT = $$PWD >> $$OUT_PWD/.qmake.cache")
system("echo QTSERIALPORT_BUILD_ROOT = $$OUT_PWD >> $$OUT_PWD/.qmake.cache")

Gdzie pierwszy jest korzeń dla projektu źródłowego, a drugi dla katalogu build. Mogą być takie same, ale w wielu przypadkach nie są, np. podczas budowania przez QtCreator tylko dla jednego z nich.

 14
Author: lpapp,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-28 12:16:23

Wybrana odpowiedź jest poprawna, ale wymaga wywołania make install, co moim zdaniem jest denerwujące lub podatne na błędy. Zamiast tego, aby skopiować pliki do katalogu build użyj:

copydata.commands = $(COPY_DIR) $$PWD/required_files $$OUT_PWD
first.depends = $(first) copydata
export(first.depends)
export(copydata.commands)
QMAKE_EXTRA_TARGETS += first copydata

Gdzie {[2] } należy zastąpić właściwą ścieżką. $$PWD jest ścieżką bieżącego pliku {[4] }, możesz tego nie wymagać.

Uwaga : znalazłem to rozwiązanie tutaj . Polecam przeczytać cały artykuł, ponieważ wyjaśnia, jak to działa.

 42
Author: Paglian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-11 17:13:52

Mając przyjemność marnować na to kilka godzin, pomyślałem, że podzielę się swoimi odkryciami w tej sprawie. To w zmodyfikowanym wariancie metody Pagliana tutaj. Ponieważ używam windows (bez mingw) ta metoda nie działa. Oto więc zmodyfikowany wariant:

# using shell_path() to correct path depending on platform
# escaping quotes and backslashes for file paths
copydata.commands = $(COPY_FILE) \"$$shell_path($$PWD\\archive.png)\" \"$$shell_path($$OUT_PWD)\"
first.depends = $(first) copydata
export(first.depends)
export(copydata.commands)
QMAKE_EXTRA_TARGETS += first copydata

Ponieważ to sprawia, że cross platform można oczywiście również użyć tej metody w Linuksie, MacOS lub co masz. Zauważ, że kopiuję pojedynczy plik, więc zamiast $(COPY_DIR) używam $(COPY_FILE). Adapt as potrzebne.


Jeśli chcesz, aby plik(y) został skopiowany do dokładnej ścieżki do tego, gdzie kończy się plik binarny (ponieważ plik binarny skończy się w podfolderze $$OUT_PWD (debug lub release, przynajmniej podczas budowania z Qt Creator z MSVC 14/cdb.exe / Code:: Blocks makefiles configuration) potrzebujesz tego:

# adapted from https://stackoverflow.com/a/2581068
CONFIG(debug, debug|release) {
    VARIANT = debug
} else {
    VARIANT = release
}

Uważaj, że nawet jeśli plik binarny kończy się w podfolderze, QtCreator wykonuje plik binarny z $$OUT_PWD, więc spodziewa się znaleźć zasoby plików w $$OUT_PWD, a nie w debug subdir. Oznacza to, że na przykład nie możesz zrobić QIcon("archive.png") i oczekiwać, że znajdzie go poza programem wykonywalnym.

Jest to oczywiście łatwe do naprawienia, wykonując:]}
QDir exeDir(QCoreApplication::applicationDirPath());
QIcon qIcon(exeDir.filePath("archive.png"));

Jeśli zdecydujesz, że tego chcesz, oczywiście musisz edytować ostatni argument $$(COPY_FILE) (W .pro) w następujący sposób: \"$$shell_path($$OUT_PWD)\\$$VARIANT\"


Należy jeszcze zauważyć, że (w moim przypadku) Qt Creator (4.0.1) nie zawsze buduje plik. pro, ponieważ nie wykrywa żadnych zmian w konfiguracji, aby powyższe zmiany znalazły odzwierciedlenie w pliku Makefile (i tym samym były uruchamiane podczas budowania projektu), musisz ręcznie zbudować plik. pro, uruchamiając Build->run qmake z menu aplikacji. Aby upewnić się, że wszystko idzie gładko, spójrz jako wyjście kompilacji naciskając Alt+4(w systemie Windows tak czy inaczej).

 19
Author: PKSWE,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:26:10

Możesz użyć zmiennych DESTDIR i PWD qmake lub OUT_PWD: http://qt-project.org/doc/qt-5.1/qmake/qmake-variable-reference.html#destdir

 3
Author: gbdivers,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-28 12:30:06

Może poniższy kod QMake pomoże jako punkt wyjścia. Kopiuje ostatnio zbudowany plik binarny do innego katalogu "TARGET_DEST":

TARGET_SRC  = $${_PRO_FILE_PWD_}
TARGET_DEST = $${PWD}/src

CONFIG(debug, debug|release) {
    TARGET_SRC = $${TARGET_SRC}/debug
} else {
    TARGET_SRC = $${TARGET_SRC}/release
}

TARGET_SRC   = $${TARGET_SRC}/$${TARGET}
TARGET_DEST  = $${TARGET_DEST}/$${TARGET}

linux-g++{
    if( equals(TEMPLATE, app) || equals(TEMPLATE, vcapp) ){
        # nothing to do here
    }
    if( equals(TEMPLATE, lib) || equals(TEMPLATE, vclib) ){
        TARGET_SRC   = $${TARGET_SRC}.so
        TARGET_DEST  = $${TARGET_DEST}.so
    }
    QMAKE_POST_LINK += $$quote(cp $${TARGET_SRC} $${TARGET_DEST}$$escape_expand(\n\t))
}

win32 {
    if( equals(TEMPLATE, app) || equals(TEMPLATE, vcapp) ){
        TARGET_SRC   = $${TARGET_SRC}.exe
        TARGET_DEST  = $${TARGET_DEST}.exe
    }
    if( equals(TEMPLATE, lib) || equals(TEMPLATE, vclib) ){
        TARGET_SRC   = $${TARGET_SRC}.dll
        TARGET_DEST  = $${TARGET_DEST}.dll
    }
    TARGET_SRC  ~= s,/,\\,g # fix slashes 
    TARGET_DEST ~= s,/,\\,g # fix slashes
    QMAKE_POST_LINK +=$$quote(cmd /c copy /y $${TARGET_SRC} $${TARGET_DEST}$$escape_expand(\n\t))
}

message("[INFO] Will copy $${TARGET_SRC} to $${TARGET_DEST}")
 3
Author: Juan Gonzalez Burgos,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-16 17:13:00

To w zmodyfikowanym wariancie metody PKSWE.

dummyTarget.commands = @echo After building copy..
QMAKE_EXTRA_TARGETS += dummyTarget
PRE_TARGETDEPS += dummyTarget

toolsCopy.commands = $(COPY_DIR) $$shell_path($$PWD/copyDir/*) $$shell_path($$DESTDIR)
dummyTarget.depends += toolsCopy
QMAKE_EXTRA_TARGETS += toolsCopy

toolsCopyLib.commands = $(COPY_FILE) $$shell_path($$PWD/setting.ini) $$shell_path($${DESTDIR})
dummyTarget.depends += toolsCopyLib
QMAKE_EXTRA_TARGETS += toolsCopyLib

Ale mam inne pytanie, Jak skopiować, jeśli się zmieni? ponieważ zajmuje to zbyt dużo czasu, gdy nie trzeba go kopiować.

 0
Author: Shun,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-10-25 10:59:45