0

私は非常に大きくなっているプロジェクトに取り組んでおり、新しいビルドがリリースされるたびにexeを誰かにアップロードする必要があり、私の接続は電話モデムです。

コードを実行することを目的とするアプリケーション用に、可能な限り最小の exe をコンパイルしたいと考えています。MessageBox(0, "Hello", 0, MB_OK);

私はVisual Studio 2010を使用しています。これまでの私の試み:

バージョン 0、サイズとスイッチ:

7kB (リリース)
使用: \O1

バージョン 1、サイズとスイッチ:

3kB (リリース)
使用: \O1、オフ バッファ セキュリティ チェック、デフォルト ライブラリ リンケージを無視。

これを 3kB よりさらに小さくすることはできますか? 実行可能ファイルのサイズに影響を与えるコンパイラ フラグは何ですか?

4

4 に答える 4

9

CRT に対して動的にリンクします (つまり、コード生成オプションで CRT の [マルチスレッド DLL] を選択します。これがデフォルトである必要があります)。サイズの最適化を選択します。アラインメント要件を下げるようにリンカーに指示します ( /ALIGN および/OPT:NOWIN98は、プロジェクト構成ダイアログのリンカー オプションの下にあるコマンド ライン オプション ボックスに入力できます) (注: これにより、アプリケーションが一部の Windows で実行されなくなる可能性があります)。バージョン)。

それに加えて、UPXなどのパッカーを使用できますが、一部のウイルス対策ツールは、コンテンツを正常に分析できない場合、圧縮された実行可能ファイルをマルウェアとして誤って検出することに注意してください。Windows 実行可能ファイル用の他の利用可能なパッカーには、Crinklerkkrunchyがあります。

パッカーがなくても、PE セクションをマージしたり、PE ヘッダー内にコードを配置したりするなど、いくつかのトリックを実行できます。これにより、約 700 バイト (非圧縮) の単純な「Hello world」MessageBox 実行可能ファイルを取得できます。ただし、Visual C++ リンカがこの種の操作をサポートしているとは思いません。これを手動で行う方法の例については、 Tiny PEページを参照してください (彼はそれを極限まで行っています)。

于 2012-08-09T14:56:54.503 に答える
3
#undef UNICODE
#define UNICODE
#include <windows.h>

void startup()
{
    MessageBox( 0, L"Hello", L"Hi", MB_SETFOREGROUND );
    ExitProcess( 0 );
}

[d:\開発\テスト]
> cl foo.cpp kernel32.lib user32.lib /O2 /link /entry:startup /subsystem:windows
foo.cpp

[d:\開発\テスト]
> foo.exeディレクトリ
 ドライブ D のボリュームはデータです
 ボリューム シリアル番号は A875-F9FD です

 d:\dev\test のディレクトリ

09.08.2012 18:00 2 560 foo.exe
               1 ファイル 2 560 バイト
               0 Dir(s) 144 102 051 840 バイト空き

[d:\開発\テスト]
> _
于 2012-08-09T16:03:20.323 に答える
3

新しい C++ Win32 プロジェクトを作成し、空のプロジェクト オプションを選択します。

次の内容のファイル main.cpp を追加します。

#include <Windows.h>

void HelloWorldMain()
{
    MessageBox(0, L"Hello", 0, MB_OK);
}

プロジェクトのプロパティで、Buffer Security Check (C++ > Code Generation) をオフにし、Ignore All Default Libraries (Linker > Input) をオフにして、Entry Point (Linker > Advanced) を HelloWorldMain に設定します。

リリース構成を構築します。出力exeは3Kになります。

于 2012-08-09T14:59:17.720 に答える
-3

何かのようなもの:

#include <windows.h>

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,PSTR szCmdLine, int iCmdShow)
{
     MessageBox (NULL, "Hello, Windows 98!", "HelloMsg", MB_OK) ;

     return 0 ;
}
于 2012-08-09T14:52:39.367 に答える