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
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.
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.
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.
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).
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
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}")
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ć.
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