qt4 - 从 Fedora 12 上的 MinGW 交叉编译到 Windows - 控制台窗口?

标签 qt4 mingw cross-compiling

看完这篇文章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 文件。啊……我讨厌 bug 。我仍然需要验证这是否解决了问题....

    最佳答案

    我怀疑您的主题问题是缺少 application manifest 的结果。

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

    关于qt4 - 从 Fedora 12 上的 MinGW 交叉编译到 Windows - 控制台窗口?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2615058/

    相关文章:

    python - 无法发送另一个线程中对象的已发布事件

    c++ - 在qt中,我如何实现一个与代码中的变量保持一致的小部件

    gcc - 交叉编译 (arm-none-eabi-as) arm assembly error "junk at end of line/"or undefined symbol

    c - 如何在 Linux 上为 Windows 交叉编译 C SDL 程序?

    qt - "Illegal instruction"交叉编译 Qt 4.7 时

    ios - 链接器错误 - 尝试链接到 arm,但链接器使用 x86

    c++ - 有没有办法在 QScriptEngine#pushContext/popContext 之外维护 Qt 脚本上下文环境?

    QTableView selectionChanged

    c++ - wxWidgets-2.9.4\include and\lib\gcc_lib\mswu No such file or directory on CodeBlocks 报错

    c++ - 无法构建,qmake.exe 在 Qt Creator 中崩溃