如何在构建 qmake 子文件夹模板后安装第一个项目?

How to install first project after build in qmake subfolder template?

我有一个带有子文件夹模板的 qtcreator 项目。文件夹如下所示:

mainProject/
   mainProject.pro
   staticLib/
      (bunch of .cpp and .h files)
      staticLib.pro
   testApp/
      main.cpp
      testApp.pro

和 mainProject.pro 文件:

TEMPLATE = subdirs
CONFIG += ordered

SUBDIRS = staticLib \
          testApp

testApp.depends = staticLib

我想安装静态库,所以我在 staticLib.pro 文件中添加了安装选项:

headersDataFiles.path = $$LIBPATH/include
headersDataFiles.files = $$PWD/*.h
INSTALLS += headersDataFiles

libraryFiles.path = $$LIBPATH/lib
Debug:libraryFiles.files = $$OUT_PWD/debug/*.a
Release:libraryFiles.files = $$OUT_PWD/release/*.a
INSTALLS += libraryFiles

问题是当我在 Qtcreator 中构建项目时,它先构建静态库,然后再构建应用程序,但没有先 运行 make install,因此应用程序构建失败。而且 Qtcreator 只允许我在 qmake_all 之后添加构建步骤(这两个项目无需先安装库即可构建)。

所以问题是,有没有什么方法可以构建 staticLib 项目,安装它然后构建 testApp?

编辑:testApp 项目始终可以从第一个项目的输出目录链接到库。但我想将 .a 和 headers 文件移动到其他文件夹以保持项目井井有条。 testApp 构建失败不是问题所在。抱歉造成误解。

我不喜欢在 Qt Creator 中添加步骤的想法(当然,如果这不是唯一的方法),因为它们在不同的开发环境中不是持久的 AFAIK。例如,每次 download/clone 从另一台机器上的存储库编写代码时,您都需要在 Qt Creator 中添加此步骤。

我们在 Windows 上完成的方式(但是,它应该也适用于其他平台)是通过 QMAKE_POST_LINK 和 $$QMAKE_COPY(pre-define qmake cross-platform复制命令):

FILES_TO_COPY = $$DESTDIR/staticLib.a <path to your header1> <path to your header2>

或者如果您愿意:

FILES_TO_COPY = $$DESTDIR/staticLib.a
FILES_TO_COPY += <path to your header1>
FILES_TO_COPY += <path to your header2>

您可以使用 $$PWD 之类的变量,而不是将完整路径硬编码到 headers,然后

DESTINATION_DIR = $$shell_quote($$shell_path("/put/it/here/"))
for (FILE, FILES_TO_COPY)
{
    FILE_PATH = $$shell_quote($$shell_path($$FILE))
    QMAKE_POST_LINK += $$QMAKE_COPY $$FILE_PATH $$DESTINATION_DIR $$escape_expand(\n)
}

更新:如果你在一个目录中有所有需要的 headers,你可以使用 QMAKE_COPY_DIR 而不是 QMAKE_COPY.

此外,如果您打算在一个特定平台上构建它,您可以省略 $$shel_quote/$$shell_path 并只写正确的路径。

或者如果你想要安装,你可以添加

QMAKE_POST_LINK=$(MAKE) install

到您的 .pro 文件