我想分发我使用 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_PREFIX
和 QT_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/