阅读完这篇文章http://lukast.mediablog.sk/log/?p=155后,我决定在Linux上使用mingw来编译Windows应用程序。这意味着我可以直接从Linux编译、测试、调试和发布。我修改了这个构建脚本,它可以交叉编译应用程序,甚至将其打包成ZIP文件。请注意,我正在使用QMake的源外编译(你知道这是支持的吗?哇……)。此外,请注意,该脚本会自动获取所需的DLL。以下是脚本,供所有互联网用户使用和滥用:
#! /bin/sh
set -x
set -e
VERSION=0.1
PRO_FILE=blabla.pro
BUILD_DIR=mingw_build
DIST_DIR=blabla-$VERSION-win32
# clean up old shite
rm -fr $BUILD_DIR
mkdir $BUILD_DIR
cd $BUILD_DIR
# start building
QMAKESPEC=fedora-win32-cross qmake-qt4 QT_LIBINFIX=4 config=\"release\ quiet\" ../$PRO_FILE
#qmake-qt4 -spec fedora-win32-cross
make
DLLS=`i686-pc-mingw32-objdump -p release/*.exe | grep dll | awk '{print $3}'`
for i in $DLLS mingwm10.dll ; do
f=/usr/i686-pc-mingw32/sys-root/mingw/bin/$i
if [ ! -f $f ]; then continue; fi
cp -av $f release
done
mkdir -p $DIST_DIR
mv release/*.exe $DIST_DIR
mv release/*.dll $DIST_DIR
zip -r ../$DIST_DIR.zip $DIST_DIR
编译出来的二进制文件在我测试的Windows7机器上可以运行。现在有一些问题:
- 当我在Windows上运行这个应用程序时,主题不是Windows7主题。我猜测可能是我缺少了一个样式模块,但我还不确定。
- 这个应用程序会弹出一个控制台窗口,原因不明。
第二个问题(控制台窗口)非常关键。我该如何去除这个背景窗口?请注意,额外的配置行对我没有作用,我错过了什么吗?
编辑1(计划进行几项):
编译命令是:
i686-pc-mingw32-g++ -enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-reloc -Wl,-s -o release/font_export.exe object_script.font_export.Release -L"/usr/i686-pc-mingw32/sys-root/mingw/lib" -lQtGui4 -lQtCore4
只有在"CONFIG+=windows"时才会添加-subsystem,windows
开关,并且在其他操作系统中将被忽略。我的猜测是Qt的MinGW端口混淆了"I am running on Linux, I need to ignore the windows/console configuration"。这意味着我需要编辑相应的qmake.spec文件。唉...我讨厌Bug。我仍然需要验证这是否解决了问题...