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 のテーマではありません。スタイルモジュールが欠けていると思いますが、まだよくわかりません。
  • アプリケーションは何らかの理由でコンソール ウィンドウを取得します。

2 番目のポイント (コンソール ウィンドウ) は重要です。このバックグラウンド ウィンドウを削除するにはどうすればよいですか? 余分な構成行が機能しないことに注意してください。何が欠けていますか?

編集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」の場合にのみ追加され、他の OS では無視されます。私の推測では、Qt の MinGW ポートが「Linux で実行しています。Windows/コンソール構成を無視する必要があります」と混乱していると思われます。これは、対応する qmake.spec ファイルを編集する必要があることを意味します。ああ...私はバグが嫌いです。これで問題が解決することを確認する必要があります....

4

2 に答える 2

3

あなたのテーマの問題は、アプリケーション マニフェストの欠落が原因であると思われます

アプリがコンソールを取得する理由は単純です。Windows アプリには、コンソールと GUI の 2 つの種類があります。違いは、EXE の PE ヘッダーに少しあります。GCC のデフォルトはコンソール アプリを生成することであり、e8johan はそれを変更する方法を説明しています (-Wl,-subsystem,windows)。エントリ ポイント (GUI はWinMain()、およびコンソール アプリを使用することが期待されますmain()) をいじることもありますが、MinGW はそれを処理する必要があります。

于 2010-04-13T12:09:33.527 に答える
2

を含めることで削除できる場合があります-Wl,-subsystem,windowsこの記事ではその方法を説明しますが、gccの非推奨機能を使用しないよう-mwindowsに置き換える必要があります。-Wl,-subsystem,windows

于 2010-04-13T11:53:00.323 に答える