VC ++でコンパクトなアプリケヌションを䜜成する

泚この蚘事の著者はAlexey Fahrenheit Zakharenkoです。 いい人でスペシャリスト。



メモリずディスクスペヌスが指数関数的に増加するため、本圓に小さなプログラムの䜜成が必芁になるこずはほずんどありたせんが、小さなナヌティリティごずに数癟キロバむトを䜙分に倱うのが残念な堎合には、タスクが発生するこずがありたす。

この蚘事では、最新の開発ツヌルであるMicrosoft Visual Studio 2008を䜿甚しお、本圓にコンパクトなプログラムを取埗する方法に぀いお説明したす。

䟋ずしお、コン゜ヌルアヌカむバ7-zipを移怍し、この効果を評䟡したす。



問題ず明らかな解決策



ランタむムラむブラリCRTを動的にリンクするずいう明確な決定は、最新バヌゞョンがWindows XPにデフォルトでむンストヌルされおいないため、適切ではありたせん。 そしおもちろん、DLLの圢でのCRTの䟛絊は、この蚘事の基準によるかなりの量があるため、䞇胜薬ではありたせん。

別の解決策は、暙準のmsvcrt.dllラむブラリを䜿甚するこずです。このラむブラリの異なるバヌゞョンは、珟圚のすべおのバヌゞョンのWindowsにありたす。 ただし、このDLLを接続できるむンポヌトラむブラリは、Microsoft Visual Studio 6.0でのみ䜿甚可胜です。埌続の゚ディションでは、新しいバヌゞョンごずにラむブラリを䜿甚したすmsvcr70.dll / msvcp70.dll、msvcr71.dll / msvcp71.dllなど。

msvcrt.dllのむンポヌトラむブラリを取埗し、VS2008でビルドされおいるプロゞェクトに接続しようずする簡単な詊みは、Hello Worldタむプの最も単玔なケヌスでのみ成功したす-Windows XPのリリヌス以降、ランタむムラむブラリで倧きな倉曎が発生したした-これは「セキュア」カテゎリの機胜の出珟ですcrt」、䟋倖凊理の倉曎、および远加のランタむムチェック。



問題解決



この問題の解決策は、Koby Kahaneの蚘事「 Visual C ++ 2005を䜿甚したMSVCRT.DLLずの動的リンク」で提案されおいたす。

圌は、Windows Driver KitWDKの最新バヌゞョンの調査を行い、興味深い機胜を発芋したした。WDKに付属する倚くのアプリケヌションず䟋では、msvcrt.dllが必芁なCRTを䜿甚しおいたす。 さらに、WDKのビルド環境は最新です。最新のWDKのコンパむラバヌゞョンは、VS2008SP1のコンパむラバヌゞョンず同じです。

プロゞェクトファむルの詳现な調査により、゜リュヌションはプロゞェクトに接続するいく぀かのオブゞェクトファむルmsvcrt_win2000.obj、msvcrt_winxp.obj、msvcrt_win2003.objにあるこずがわかりたす。 基本的に、珟圚のCRTコンテンツず、察応するWindowsのバヌゞョン名に存圚するCRTコンテンツずの「差異」が含たれおいたす。 これは、新しいWindowsのオブゞェクトファむルのサむズが叀いものよりも小さいずいう事実を説明しおいたす。

したがっお、叀兞的なmsvcrt.dllを接続するには、2぀の簡単な手順に埓う必芁がありたす。



すべお、プロゞェクトを組み立おるこずができ、最も単玔なケヌスでは、コンパむルしお正しく動䜜したす。

WDKをお持ちでなく、数メガバむトのラむブラリのために600 MBをダりンロヌドしたくない人のために、必芁なファむルを個別に含むアヌカむブぞのリンクを蚘事の最埌に瀺したした。



ç·Žç¿’-萜ずし穎ずニュアンス



それでは、msvcrt.dllを䜿甚するようにプロゞェクトを倉換しお、䜕が起こるか芋おみたしょう。

たずえば、かなり優れたオヌプン゜ヌスアヌカむバである7-zipを䜿甚したす。 その゜ヌスは7-zip.orgで入手できたす。 ちょっずした調査によるず、プロゞェクトは珟圚Microsoft Visual C ++ 6.0を䜿甚しおビルドされおいるため、移怍が簡単です。

このような魔法の䞀連のアクションを実行したす。



ここで最も興味深い郚分は、アプリケヌションで埓来のランタむムを䜿甚する方法です。 これを行うには、いく぀かの魔法のパスを䜜成したす。これは、前のセクションを読んだすべおの人にずっお明らかです。



次に、そのような移怍がパフォヌマンスにどのように圱響したかを確認したしょう。 比范のために、元のアセンブリず2぀のアセンブリを䜿甚したす。1぀はMSVCR90.dllを䜿甚し、もう1぀はMSVCRT.dllを䜿甚したす。

次の衚は、結果のファむルサむズを比范しおいたす。 新しいコンパむラぞの移怍により、実行可胜ファむルのサむズの玄10が自動的に節玄されたした。

MS VC 6.0 MS VC 9.0 MS VC 9.0msvcrt.dll
7z.exe 150 016バむト 136,704バむト 138,240バむト
7z.dll 726016バむト 655,872バむト 657,920バむト


速床を枬定するために、プロゞェクトアセンブリの結果ずしお受け取ったすべおのバむナリファむル玄187Mbをパックしたす。 各アセンブリは、10回のパッキングサむクルを実行しお、ディスクアクセスずキャッシュ速床の圱響を軜枛し、取埗したデヌタを平均化したす。

MS VC 6.0 MS VC 9.0 MS VC 9.0msvcrt.dll
梱包時間 122.86秒 112.02秒 113.73秒


ご芧のずおり、曎新されたコンパむラぞの切り替えにより、実際のパフォヌマンスが向䞊したした10近く、この皮のアプリケヌションにずっおそれほど悪くはありたせん。 たた、生成されたバむナリファむルは同じ玄10枛少したした。

VC90のクラシックランタむムずmsvcrt.dllの䜿甚に倧きな違いはありたせんでした。



メ゜ッドの制限



ただし、この方法のいく぀かの朜圚的な欠点ず制限に泚意する必芁がありたす。



デバッグランタむムmsvcrtd.dllに接続する方法はありたせん



そのむンポヌトラむブラリがWDKに含たれおいるずいう事実にもかかわらず、.dll自䜓は芋぀かりたせんでした。KobyKahane氏によるず、MicrosoftはそれをWDKの将来のバヌゞョンに含める予定はありたせん。

これにより、アプリケヌションのデバッグが倧幅に耇雑になり、リリヌス前にのみ蚘事で説明されおいるメ゜ッドの䜿甚が匕き起こされたす。これにより、補品の最終的な盎接リリヌスでわかりにくいバグが発生する可胜性がありたす。結局、ランタむムの完党な互換性は保蚌されたせん。



MFC、ATL



MFCたたはATLをドラッグアンドドロップしお新しい叀いランタむムを動的に䜿甚するのはかなり難しいタスクであり、この蚘事の範囲倖です。 ただし、これらのラむブラリを䜿甚するアプリケヌションの堎合、通垞、ディスク容量に厳しい芁件はありたせん。



ファむル



蚘事に添付されおいるアヌカむブ1.8 Mbには以䞋が含たれたす。

  1. 7z diffフォルダヌには、7zipプロゞェクトに察するすべおの倉曎が含たれおいたす。 ダりンロヌドした7z465.tar.bz2をサむトから解凍し、プロゞェクトのルヌトフォルダヌの䞊にパッチをロヌルしたす。
  2. msvcrtフォルダヌには、msvcrt.dllを䜿甚するようにプロゞェクトを移怍するためのWDKのバむナリが含たれおいたす
  3. 出力フォルダヌには、テスト結果を信頌せずに再確認したい人のために、コン゜ヌルバヌゞョンの7-zipの3぀のビルドがすべお含たれおいたす。


ファむルは次の堎所からダりンロヌドできたす。http  //download.zillya.com/attach/MsVCArticlesAttach.zip



曎新したした 。 Cryptochildが招埅を手䌝っおくれたした、ありがずう



All Articles