Qt Creator子项目只是为了复制文件

时间:2015-08-11 20:54:06

标签: qt qmake

我有一个Qt子项目,包含带文件的目录(没有源代码)。这些文件将被复制到build/bin目录

QtProject
  subproject1 (contains code)
  subproject2 (only contains directories with files to be copied)
    files1
    files2

到目前为止,我一直在使用QMAKE_PRE_LINKQMAKE_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)

1 个答案:

答案 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

使用qmake

将数据文件复制到构建目录 拖拉在他的网站上很好地说明了这一点。我复制了一些块。

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很难出错。

希望有所帮助。