我的 Qmake 项目中有一个文件列表。我希望它们在构建时复制到构建目录中。
我的qmake文件如下
OTHER_FILES += \
input1 \
input2 \
input3 \
我使用的是Linux。我读过一些堆栈溢出问题并用谷歌搜索了我的问题,但找不到确切的解决方案。
可以使用
for()
循环来完成。您可能需要调整 BUILD_DIR
变量。 “其他”文件取自当前目录。
OTHER_FILES += \
input1 \
input2 \
input3 \
BUILD_DIR = build
for(file, OTHER_FILES) {
eval($${file}.depends = $$file)
eval($${file}.target = $$BUILD_DIR/$$file)
eval($${file}.commands = cp $$file $$BUILD_DIR/)
QMAKE_EXTRA_TARGETS += $${file}
PRE_TARGETDEPS += $$BUILD_DIR/$$file
}
我需要将 openssl 1.1 dll(libcrypto-1_1-x64.dll 和 libssl-1_1-x64.dll)复制到构建目录中以便进行网络通信。我在带有 gcc 7.3.0 编译器的 Windows 11 64 位机器上使用 Qt 5.13.0。我的项目结构是, |项目根| D:\Qt\MyProject | | ------------ | --------------- | |项目文件| D:\Qt\MyProject\MyProject.pro | |调试构建 | D:\Qt\MyProject\调试 | |发布构建| D:\Qt\我的项目 释放 | |要复制的文件| D:\Qt\MyProject\library | 我尝试了多种解决方案,但只有以下代码片段对我有用。
win32 {
CONFIG( debug, debug|release ) {
DEST_DIR = debug # debug
}
else {
DEST_DIR = release # release
}
}
TARGET_DIR = $${OUT_PWD}/$${DEST_DIR}
# List of files to be copied to target directory
FILELIST = "library/libcrypto-1_1-x64.dll" # ssl 1.1.x (qt>=5.12.4)
FILELIST += "library/libssl-1_1-x64.dll"
win32:TARGET_DIR ~= s,/,\\,g
for(FILE, FILELIST) {
win32:FILE ~= s,/,\\,g
$$basename(FILE).depends = $$shell_quote($$FILE)
$$basename(FILE).target = $${TARGET_DIR}/$$basename(FILE)
$$basename(FILE).commands = $(COPY_FILE) $$shell_quote($$FILE) $$shell_quote($${TARGET_DIR})
QMAKE_EXTRA_TARGETS += $$basename(FILE)
PRE_TARGETDEPS += $${TARGET_DIR}/$$basename(FILE)
}
在上述情况下,对于调试构建,QMake 在 Makefile 中生成两个规则,
D:/Qt/MyProject/debug/libcrypto-1_1-x64.dll: library/libcrypto-1_1-x64.dll
$(COPY_FILE) library\libcrypto-1_1-x64.dll D:\Qt\MyProject\debug
D:/Qt/MyProject/debug/libssl-1_1-x64.dll: library/libssl-1_1-x64.dll
$(COPY_FILE) library\libssl-1_1-x64.dll D:\Qt\MyProject\debug
这可确保仅当库目录中的文件更新时才会复制文件。
参考资料: