我有一个Qt子项目,仅包含带文件的目录(没有源代码)。这些文件将被复制到build/bin
目录
QtProject
subproject1 (contains code)
subproject2 (only contains directories with files to be copied)
files1
files2
到目前为止,我一直在使用QMAKE_PRE_LINK
和QMAKE_PRE_LINK
复制文件(有效)。但是,由于项目模板为TEMPLATE = lib
,因为没有要生成的代码,我会收到编译警告(参见下图)。
如果我更改为TEMPLATE = subdirs
,则不会触发副本,因为没有链接操作。
那么如何在没有任何源代码的情况下触发复制操作呢?
使用TEMPLATE = lib
:-1: warning: LNK4001: no object files specified; libraries used
:-1: warning: LNK4068: /MACHINE not specified; defaulting to X86
:-1: error: LNK2001: unresolved external symbol __DllMainCRTStartup@12
debug\blackresources.dll:-1: error: LNK1120: 1 unresolved externals
复制哪些有效,但上述编译错误除外
QMAKE_PRE_LINK += $$COPY $$shell_path($$PWD/data) \
$$shell_path($$OUT_PWD/../bin/resources)
答案 0 :(得分:2)
文档中以通用方式提及额外构建步骤......
http://doc.qt.io/qt-5/qmake-advanced-usage.html#adding-custom-targets
mytarget.target = .buildfile
mytarget.commands = touch $$mytarget.target
mytarget.depends = mytarget2
mytarget2.commands = @echo Building $$mytarget.target
...
QMAKE_EXTRA_TARGETS += mytarget mytarget2
http://dragly.org/2013/11/05/copying-data-files-to-the-build-directory-when-working-with-qmake/
copydata.commands = $(COPY_DIR) $$PWD/data $$OUT_PWD first.depends = $(first) copydata export(first.depends) export(copydata.commands) QMAKE_EXTRA_TARGETS += first copydata
以上不同名称的含义如下:
$(COPY_DIR)
- 保存与平台相关的复制命令,确保以递归方式复制。$$PWD
- 保存.pro文件所在的源代码目录的名称。$$OUT_PWD
- 保存构建目录的名称。请注意,如果您在同一目录中运行qmake和make,则这可能不起作用 作为您的源代码,因为您将复制到相同的文件夹中 你复制。copydata
- 我们选择的名字。您可以将其替换为您想要的任何内容。first
- 这是qmake生成的Makefile中已存在的构建步骤。我们将复制构建步骤附加到此构建步骤。 export - 使函数的参数中的变量可用 在全球范围内。QMAKE_EXTRA_TARGETS
- 告诉qmake你想构建比默认添加到Makefile的目标更多的目标。这种方法 有点乱,我希望Qt开发人员能够更容易 这样做,但它的工作原理。它还确保始终复制数据, 确保将数据文件夹中的任何更改推送到构建 文件夹中。
在Windows上,我个人喜欢robocopy
以满足我的所有镜像需求。在linux / mac上,rsync
很难出错。
希望有所帮助。