qmake 为 win32-g++ 平台生成的 Makefile 包含 unix 命令

qmake-generated Makefile for win32-g++ platform contains unix commands

我正在尝试使用 Qt 5.4.1 构建交叉编译器,以从 Windows 8.1 64 位计算机生成 Raspberry Pi 可执行文件。

我在 Windows 机器上为 Pi 使用 mingw64 和 gcc 4.9 交叉编译器,我使用的是 Qt 5.4.1 源代码。 PATH 指向 mingw64 二进制文件、gcc 4.9 交叉编译器二进制文件、perl 二进制文件和 %windir%\system32.

我使用以下命令构建 Qt 交叉编译器:

configure.bat -platform win32-g++ -opengl es2 -device linux-rasp-pi-g++ \
 -device-option CROSS_COMPILE=arm-linux-gnueabihf- -sysroot \dev\qtxc\sysroot \
 -opensource -confirm-license -release -make libs -prefix d:\dev\qtxc \
 -platform win32-g++ -xplatform linux-arm-gnueabi-g++

一切正常,直到最后我收到一些包含 Unix 命令的错误消息(同样,我在 Windows 机器上的 Windows 命令提示符下):

Running configuration tests...
process_begin: CreateProcess(NULL, rm -f arch.obj, ...) failed.
make (e=2): The file cannot be found
(...)

然后当我查看生成的 Makefile 时,我可以看到它错误地定义了 Unix 命令而不是 Windows 命令:

# Makefile for building: qt
# Generated by qmake (3.0) (Qt 5.4.1)
# Project:  qt.pro
# Template: subdirs
# Command: D:\dev\qtxc\qtbase\bin\qmake -o Makefile qt.pro

MAKEFILE      = Makefile

first: make_first
QMAKE         = D:\dev\qtxc\qtbase\bin\qmake
DEL_FILE      = rm -f
CHK_DIR_EXISTS= test -d
MKDIR         = mkdir -p
COPY          = cp -f
COPY_FILE     = cp -f
COPY_DIR      = cp -f -R
(...)

然后,当然,当我按照 configure 命令输出中的指示尝试 运行 mingw32-make 时,我收到与 Unix 命令相关的错误消息不存在于 Windows:

module-qtbase-qmake_all:  FORCE
    @test -d qtbase\ || mkdir -p qtbase\
    cd qtbase\ && $(QMAKE) D:\dev\qtxc\qtbase\qtbase.pro -o Makefile
    cd qtbase\ && $(MAKE) -f Makefile qmake_all

(当然,@test 在 Windows 中不起作用)。

我已经尝试修改 qtbase\mkspecs\win32-g++\qmake.conf 文件以删除 Unix 条件定义(无论如何将它们放在 win32 文件中似乎是无稽之谈),强制定义 QMAKE_SHQMAKE_OS_WIN32, 无济于事。

有什么建议吗?

我在设置 Gitlab-CI 运行程序以在 windows.

上编译 Qt 项目时遇到了同样的问题

在 qmake 上使用 -d(调试)选项(参见 Running qmake)我发现 qmake 在 PATH 中查找 sh 然后通过设置 sh 来确定要使用的命令集 QMAKE_SH.

如果你在 qmake 自下而上的调试输出中搜索 QMAKE_SH,你应该找到 qmake 做出上述决定的行。如果找到 sh,进一步向上搜索会将您带到打印出 sh 的实际路径的那一行。

我的是在 Git 的路径中找到 Windows (<path to git>\bin),因为在 [=36= 旁边的 bin 文件夹中有一个 'sh.exe' ].

我为我的特殊情况找到了两个解决方案:

  1. 暂时将 unix 工具添加到 PATH。在 Git for Windows 2.5.3 中,它们位于 <path to git>\usr\bin.
  2. 暂时从 PATH 中删除 sh 的路径。您可以通过向命令行发出 SET PATH=%PATH:<path to remove>;=% 来执行此操作。