4

我有一个项目,其中头文件位于 qt 项目文件中的不同子文件夹(/config/.h;/thread/.h等)中,它们包括:

HEADERS += $$PWD/src/*.h
HEADERS += $$PWD/src/config/*.h

然后安装被描述为简单:

headers.files = $$HEADERS
headers.path  = $$INSTALL_INC_DIR/proj

使用此库的其他一些项目将包含该安装目录中的文件并出现问题 - 所有 .h 文件都复制到同一个文件夹,没有子文件夹,并且在代码中它们包含在子文件夹(#include <proj/config/config.h>)中。

是否可以告诉 qmake(或实际上是 nmake)在复制文件时保留原始文件夹结构?

4

2 回答 2

7

这对我有用:

标头安装.pri:

for(header, INSTALL_HEADERS) {
  path = $${INSTALL_PREFIX}/$${dirname(header)}
  eval(headers_$${path}.files += $$header)
  eval(headers_$${path}.path = $$path)
  eval(INSTALLS *= headers_$${path})
}

在 .pro 文件的末尾:

INSTALL_PREFIX = /tmp/installprefix
INSTALL_HEADERS = $$HEADERS
include(headerinstall.pri)
于 2013-09-13T06:28:24.800 回答
0

我敢肯定,目前接受的 2013 年答案暂时有效。但是,对于我来说,在$${path}. 现在,我们还必须$$list()列出一个文件列表,以便在 for 循环中使用它。

这是我想出的方法。我把它写在一个*.pri文件中并将它添加到我的目录结构中。不需要额外的INSTALL_HEADERS变量:

for(header, $$list($$HEADERS)) {
  path = $$OUT_PWD/../include/$$dirname(header)
  pathname = $$replace(path,/,)
  pathname = $$replace(pathname,\.,)
  pathname = $$replace(pathname,:,)
  file = headers_$${pathname}
  eval($${file}.files += $$header)
  eval($${file}.path = $$path)
  INSTALLS *= $${file}
}

请注意,替换字符可能因您而异。例如,我上面的第一种方法仍然存在路径中的空格问题,所以我添加了:

pathname = $$replace(pathname," ",)

于 2019-05-08T14:20:27.997 回答