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 

-subsystem,windows开关仅在“CONFIG+=windows”时添加,在其他操作系统中被忽略。我的猜测是 Qt 的 MinGW 端口变得混乱“我在 Linux 上运行,我需要忽略 windows/console 配置”。这意味着我需要编辑相应的 qmake.spec 文件。啊……我讨厌虫子。我仍然需要验证这是否解决了问题....

4

2 回答 2

3

我怀疑您的主题问题是缺少应用程序清单的结果

您的应用程序获得控制台的原因很简单。Windows 应用程序有两种风格,控制台和 GUI。不同之处在于 EXE 的 PE 标头。GCC 的默认设置是生成一个控制台应用程序,e8johan 解释了如何更改它(-Wl,-subsystem,windows)。还有一些与入口点有关的玩弄(GUI 应该使用WinMain(),和控制台应用程序main()),但MinGW 应该注意这一点

于 2010-04-13T12:09:33.527 回答
2

您也许可以通过包括-Wl,-subsystem,windows. 本文展示了如何使用,但您希望替换-mwindows-Wl,-subsystem,windows以避免使用 gcc 已弃用的功能。

于 2010-04-13T11:53:00.323 回答