在 Fedora 12 上使用 MinGW 进行交叉编译到 Windows 系统时,如何创建控制台窗口?

4
阅读完这篇文章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。我仍然需要验证这是否解决了问题...

2个回答

3
我怀疑你的主题问题是由于缺少应用程序清单引起的。
你的应用程序出现控制台的原因很简单。Windows应用程序有两种类型,控制台和GUI。区别在于EXE的PE头部分有些不同。GCC的默认设置是生成控制台应用程序,e8johan解释了如何更改它(-Wl,-subsystem,windows)。还有一些入口点方面的麻烦(GUI应该使用WinMain(),而控制台应用程序应该使用main()),但MinGW应该会处理好这些问题

2
您可以通过包含-Wl,-subsystem,windows来删除它。 这篇文章展示了如何操作,但您需要将-mwindows替换为-Wl,-subsystem,windows,以避免使用gcc的已弃用功能。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接