c++ - 修补 Qmake 以使用特定(和相对)路径

标签 c++ qt qmake

我想分发我使用 Qt 制作的 SDK。 为此,我制作了一个脚本来生成包含我的库(libmysdk.so 等)的 tarball 以及带有 qmake 二进制文件的嵌入式 headless “最小 Qt”(-no-gui、-no-widgets 等) .

这里的目标是允许用户使用我的 Sdk 开发一个应用程序,用他想要的任何东西填充 .pro,并让他调用 qmake 来生成合适的 Makefile。

我的问题是生成的 Makefile 包含我在本地编译 qmake 的地方的绝对路径和相对路径(/home/john/mystuff/myproject 等),这使得它根本不可移植。

在生成文件中:

CC            = /opt/arm-2015.02-ct-ng/bin/arm-unknown-linux-gnueabi-gcc
[...]
INCPATH       = -I. -Iinclude -I../../home/john/mystuff/myproject/builddir

我正在寻找一种方法来强制 qmake 使用我在 tarball 中提供的“嵌入式 Qt 安装”。

我尝试了两件事:

./qmake -query "QT_INSTALL_HEADERS"

将打印(错误的)绝对路径。但是

./qmake -set "QT_INSTALL_HEADERS" "foo/bar/something"

不会更新 QT_INSTALL_HEADERS 值。我的猜测是内置值不能在 qmake 二进制文件中更改,对吗?

我的第二次尝试是使用这个 https://github.com/qtproject/qtsdk 更具体地说,patch_qmake_qt_key.py 的目标显然是更新二进制文件中的某些键(内置或非内置)。 但是我尝试了几个“键”名称,总是出现相同的错误:

Could not find given key: QT_INSTALL_HEADERS

Could not find given key: INSTALL_HEADERS

Could not find given key: PLEASE_WORKS
etc.

(有什么地方/文档可以让我找到那些“键名”吗?)

在 qmake 编译之后(或者可能之前)有没有办法设置路径,最好是相对于 tarball 根目录,或者如果不可能,设置绝对路径的方法(可能通过调用 ./install.sh which使用 pwd 和东西的某种组合更新 qmake 二进制文件。

非常感谢!

最佳答案

你怀疑它是关于键名的,因为它们在外部和内部表示之间是不同的:特别是,在外部可见的 QT_INSTALL_HEADERS,实际上是 qt_hdrspath inside qmake 可执行文件。

更重要的是,以上仅适用于 Qt 3.x 和 4.x 的 QMake。自 Qt 5.x 以来,QMake 仅定义了一组狭窄的基本路径,— 实际上,qt_prfxpath(加上 qt_epfxpath)和 qt_hpfxpath,—分别对应于 QT_INSTALL_PREFIXQT_HOST_PREFIX。所有其他位置都是在这些前缀之上计算的,具有硬编码的子路径,这些子路径不能像基本变量那样容易更改,-至少不能自动更改,因为它们只能通过查找它们的确切值来找到,并且因为几乎没有没有为它们的值(value)保留额外的空间。例如,QT_INSTALL_HEADERS 在 Linux 包中被计算为 QT_INSTALL_PREFIX + "/include/qt5"QT_INSTALL_PREFIX + Windows 构建(MSVC 和 MinGW)中的 "/include"

作为 patch_qmake_qt_key.py 脚本的替代方案,如果提供正确的键名,它确实可以工作,我创建了 QmakePatch实用程序,您可能会发现它本身或其文档很有帮助:README.md 列出了已知 Qt/QMake 版本的键名和其他技术细节(GitHub 在存储库的主页上显示)。


但是,关于相对路径,我强烈怀疑在 Makefile 中使用它们是个好主意,因为当前工作路径通常在构建过程。例如,即使您尝试 make INSTALL_ROOT=./destdir install,它也会导致每个子项目都安装到它们自己的 ./destdir 子目录中,而不是一个位于您从中调用 Make 的最顶层目录中。

关于c++ - 修补 Qmake 以使用特定(和相对)路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34284937/

相关文章:

c++ - 在运行时向 vector 插入元素 C++。抛出运行时错误

mysql - 无法为 Windows 编译 QT MYSQL 插件

qt - 将 Makefile 前置/附加到 Qt 生成的 Makefile

c++ - 在 Harmattan 上制作 QWidget 应用程序肖像的明确指南

c++ - 在这种情况下如何正确使用 qmake?

QT:正常的VS项目文件要构建吗?

c++ - clang 和 __rdtscp : What is it and what is the error

c++ - #include .h 和只声明 A 类之间的区别;在 C++ 中

c++ - 使用 std::pair 作为 std::unordered_map 中的键

qt - 如何通过 QT 中的特定网络接口(interface)写入数据报?