(エグゼクティブ サマリー (TL;DR) は下部にあります)
重要: この回答は、Microsoft の公式ツールチェーンのみを参照しており、リンクすることが知られている MinGW ツールチェーン (GCC ベース) などには言及していませんmsvcrt.dll
。しかし、マイクロソフトがとにかくそのツールチェーンをサポートする傾向があるとは思えません;)
短い答え: いいえ!
タスクに Visual C++ 2010 を使用しようとさえしないでください。
公式でサポートされている方法があります。アプリケーションをリンクする必要がある場合は、スタンドアロンの WDK を使用してくださいmsvcrt.dll
。
CRT ヘッダーおよびライブラリと一致しないコンパイラ ツールチェーンを使用しないでください。ツールチェーンは、作成したパッチワークではなく、Microsoft が意図したとおりに使用してください。混同しないでください。Microsoft から渡されたものを使用します。ただし、それを使用してください (FUD を恐れないでください)。
リンクに使用できる最新の WDK msvcrt.dll
(7600.16385.1) は、cl.exe
バージョン 15.00.30729.207 を使用します。これは、Visual C++ 2008 に付属するコンパイラにほぼ対応しています。以降の WDK は、必要な Visual C++ バージョンの CRT にリンクします。
msvcrt.dll
たとえば、Windows XP または Windows 7 は、Visual C++ 6.0 (VC6の最新バージョンであっても) に含まれていた元のDLL ではありません。
これは、他の回答でも正しく述べられています。そこに驚きはありません。
ただし、msvcrt.dll
最新のシステムで見つかるものは、他の回答が示唆するものとは反対に、元の VC6 CRT にリンクされたプログラムが引き続き機能することを可能にします。今日も。契約です。そして、msvcrt.dll
システム DLL への昇格により、そのコントラクトがさらに検証されました。
ちょっとした歴史的背景
Microsoft が内部的に使用するツールチェーンは、Windows 8 WDK より前の WDK が提供していたものと多少似ていました。これらについてのみ記述し、WDK (またはスタンドアロン WDK) という用語を一様に使用します。Vista WDK より前は DDK と呼ばれていました。
Windows のソース コードにアクセスできると思われるOSRの善良な人々、またはアクセスできる人々は、私が数年前に参加したあるセミナーで、WDK は Windows を中心に Windows を構築するために内部で使用されるツールチェーンの縮小版であったことを確認しました。時間(〜2005)。同様のヒントは、MSFT 自身の Larry Ostermanと、「Windows Internals」の最近の版の共著者であるtinykrnl に関する Alex Ionescu の初期の作品から見つけることができます。BCZbuild -cZ
は、ここで説明している WDK で一般的に使用される呼び出しを暗示している可能性があります。
このコンテキストで興味深い理由は、すべてのスタンドアロン WDK でmsvcrt.dll
、既定でリンクする実行可能ファイルを作成できることです。スタンドアロン WDKの場合msvcrt.dll
はCRT であり、 Visual C++ 2010 の場合と同様にmsvcr100.dll
.
また、ツールチェーンが Visual Studio ツールチェーンと共に更新されたことにも注意してください。たとえば、3790.1830 の WDKcl.exe
レポートでは、Visual C++ 2003 とほぼ同等です。
C:\WINDDK\3790.1830\bin\x86>cl /version
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 13.10.4035 for 80x86
Copyright (C) Microsoft Corporation 1984-2002. All rights reserved.
また、6001.18002 WDK (Windows 2000 をサポートする最新版!) の場合、Visual C++ 2005 とほぼ同等です。
C:\WINDDK\6001.18002\bin\x86\x86>cl/version
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 14.00.50727.278 for 80x86
Copyright (C) Microsoft Corporation. All rights reserved.
7600.16385.1 WDK の場合、Visual C++ 2008 と同等です。
スタンドアロン WDK
XP 用のものから始まり、Windows 7 SP1 まで (および Windows 7 SP1 を含む) の WDK バージョンでは、Visual Studio は必要ありませんでした。彼らには独自のツールチェーンが付属していました。
Windows XP より前のバージョンでは、何かをビルドするために Visual C++ が必要でした。私の記憶が正しければ、Windows 2000 DDK の VC6 です。
Windows 8 WDK 以降のバージョンでは、再び Visual C++ が必要になり、これまで以上に緊密に統合されます (ウィザード、さらにはデバッグ用の拡張機能や一部のドライバー固有のタスクも含まれます)。これが、それぞれの WDK を使用するときに、それぞれのツールチェーンの CRT にリンクする理由でもあります。
スタンドアロン WDK の時代には、人々が Visual Studio を使用して WDK ビルド プロセスをラップしようとしたことは前代未聞ではありませんでした。Microsoft が推奨するサポートされていない方法を使用し、Visual Studio ツールチェーンを使用してドライバーを構築した人もいます。これらのサポートされていない方法は、おおむねあなたが試みていることになります。だからしないでください。
とにかく、WDK のbuild.exe
withsources
などを使用したビルド プロセスmakefile
は面倒で制限がありました。たとえば、現在のディレクトリまたはその親ディレクトリ以外のソース ファイルからビルドするには、独自の NMake ルールを作成する必要があります。結局のところbuild.exe
、NMake ベースのビルドのラッパーでした。あなたのローカルmakefile.inc
は、WDK/DDK によって提供されるグローバルなものに含まれます。
へのリンクmsvcrt.dll
が公式にサポートされている理由
前述のように、リンクmsvcrt.dll
はスタンドアロン WDK でサポートされています。
これもまったく問題ありません。実際、ファイルUSE_MSVCRT=1
内のステートメントsources
はまさにその効果があります。ここを参照してください。7600.16385.1 WDK ドキュメントからの引用:
USE_MSVCRT
このマクロを使用してUSE_MSVCRT
、Build ユーティリティがビルド用の DLL でマルチスレッド ランタイム ライブラリを使用するように指示します。
構文
USE_MSVCRT = 1
[...]
注:Msvcrt.lib
またはを に リストしないMsvcrtd.lib
でTARGETLIBS
ください。Ntdll.lib
ただし、 にリストすることはできますTARGETLIBS
。
サポートされていないのに、なぜ Microsoft はこのパスを提供するのでしょうか? 正しい、彼らはしません!
実際のところ、WDK (XP..7 SP1) はシステム DLL msvcrt.dll
を CRT として使用しています。
注意事項
主に1つの注意事項があります。SEH の実装方法は、Visual C++ の新しいバージョンで時間の経過とともに変化しています。スタンドアロン WDK のツールチェーンは、特定の Visual C++ バージョンに密接に対応しているため、それぞれの SEH 処理を継承しています。
たとえば、Windows 7 SP1 WDK を使用して Windows 7 を対象としUSE_MSVCRT=1
、_except_handler4_common
. たとえば、その機能は Windows Server 2003 では使用できませんでした。そのため、ターゲットバージョンより前のバージョンの Windows でこのようなアプリケーションを実行しようとすると、失敗する可能性があります。そのような場合、「サポートされていない領域」に足を踏み入れることになり、すべての免責事項が適用されます。ただし、ここで概説されている方法を使用するオプションがあります。つまりmsvcrt_win2000.obj
、 、msvcrt_winxp.obj
およびmsvcrt_win2003.obj
(Vista および 7 WDK で使用可能) にリンクして、希望する (バイナリ) 下位互換性のレベルを達成することができます。
一方、設定することに決めた場合WINVER=0x0601
、結果の実行可能ファイルが、たとえば Windows XP では利用できない kernel32.dll (または他のシステム DLL) から関数をインポートすることに驚かないでください。では、なぜ に関して異なるセマンティクスを期待するのmsvcrt.dll
でしょうか?
別の補足として、チェックされたビルド (通常、デバッグ ビルドに対応すると見なされます) でさえmsvcrt.dll
、デバッグ バージョンの対応物ではなく、 に対してリンクします! 「チェック済み」とは、アサーションが残っているという事実を指すためです。「リリース」や「デバッグ」など、CRT の特定の構成を指すものではありません。msvcrt.dll
スタンドアロン WDK でのデバッグ ビルドが利用できないということは、それらの WDKのC ランタイムではないことを意味するという仮定は、チェック ビルドが何を意味するかについての明白で単純な誤解です。
もう 1 つ小さな注意事項があります。たとえば、Windows 7 WDK を使用して へのリンクを実現する場合、 Windows 7以降msvcrt.dll
の開発を認識していないツールチェーンを使用しています。これには、インポート ライブラリだけでなく、ヘッダーも含まれます。そのため、リリース時に利用できなかった機能をサポートするとは思わないでください。
システム DLL:msvcrt.dll
msvcrt.dll
は、数年前にシステム DLL のステータスに昇格されました。これは、それぞれの再頒布可能パッケージをインストールする必要がある他の Visual C++ CRT とは異なり、システムに含まれていることを意味します (文字通り信頼できます)。これは、別の回答で引用された Raymond Chen によるブログ投稿の要点でもあります。
スタンドアロンの WDK (XP..7 SP1) はデフォルトでmsvcrt.dll
CRT としてリンクするため、それに対する客観的な議論はありません。もちろん意見は様々。
「お返事」
残念ながら、私が最初にコメントしてから大きく変わったこの回答は、FUDを永続させ、信頼できるとされる情報源からの引用を文脈から引き出そうとします。また、元の (MSFT) ソースへのリンクも含まれています。これらのソースは、よく調べてみると、リンクされたサポートのステートメントをサポートしていません。
Microsoft の Raymond Chen は、数年前にこれについてブログを書きました。彼のブログからWindows is not a Microsoft Visual C/C++ Run-Time delivery channel :
Visual C++ のすべてのバージョンと互換性のある 1 つの DLL は、メンテナンスの悪夢でした... ある時点で、それをオペレーティング システム DLL として宣言し、オペレーティング システム コンポーネントのみが使用できるようにするという決定が下されました。
鉱山を強調します。もう一度考えてみてください。本当に Windows に付属するものを書いているのでしょうか? Microsoftが 10 年以上前にコンパイラの互換性を断念したシステム コンポーネントに依存する代わりに、サポートされているファイルをセットアップ プログラムに追加したり、CRT の静的バージョンをリンクしたりするのは難しいですか?
さて、2010 年 2 月は 10 年以上も前のことでしょうか (この回答が書かれたのは 2016 年 3 月)? . _ _ msvcrt.dll
_
Raymond の発言の残りの部分は、Microsoft が最初に意図したものと一致する可能性がありますが、Microsoft がそれをあきらめて、システム DLL に昇格させたことを認めています。
また、真に古い歴史 (Windows 9x) と、Windows 9x をサポートしていないスタンドアロンの WDK の使用を推奨する推奨事項を混在させるのは、非常に不誠実です。Raymond が説明する歴史的背景は、W2K より前であり、NT ではありません。上記で説明した背景は、Windows の NT 系統に言及しており、実際にはスタンドアロンの DDK/WDK (およびそれ以降) しか知らないため、それ以前はどうだったか、またはそうあるべきだったかはわかりません。
つまり、彼のブログはMicrosoft の公式ドキュメントと混同されるべきではありません。
10 年以上前のことですがmsvcrt.dll
、Windows 2000 (SP4) のバージョン情報には次のように記載されています。
Description: Microsoft (R) C Runtime Library
Product: Microsoft (R) Visual C++
Prod version: 6.10.9844.0
File version: 6.10.9844.0
... レイモンドの紹介文に反します。
Windows XP でのみ、次のように変更されました。
Description: Windows NT CRT DLL
Product: Microsoft« Windows« Operating System
この決定を未だに否定している人々の数は驚くべきものです。
いくつかの以前のコメントの後、これが私を真っ向から狙っていると推測するのは公正です.
Windows 8 WDK のリリースに関する決定を否定しているわけではありません。ただし、それはリンクを公式にサポートしたスタンドアロン WDK を「リリース解除」msvcrt.dll
したり、それぞれの公式ドキュメントに記載されている内容を「ドキュメント解除」したりしません。
ねえ、Windows 7 または 8 以降、またはそれに沿ったものだけをサポートする必要があるという贅沢な立場にいるのは、私にとって素晴らしいことです。ただし、以前の Windows バージョンもサポートする必要があるため、これらの Windows バージョン用に Microsoft が提供する公式ツールを最大限に活用します。適切な SDK が統合された Visual C++ 2005 であること、またはスタンドアロンの WDK であること。
それらの人々は、「Visual C++ 製品チームに多くの悲しみをもたらしました」
この声明は、Raymond Chen による前述のブログ投稿を参照していますが、Raymond の声明を文脈、特に時間的な文脈から切り離しています。悲しみは、質問者がやりたいことを人々が試みたことによって引き起こされました-さらに悪いことに、の内臓/内部に手を伸ばしましたmsvcrt.dll
. そして、それはW2K以前でした。これは、Microsoft のスタンドアロン WDK のような公式のツールチェーンを使用したことが原因ではありません(また、そうなる可能性もありません)。
最新バージョンの Windows の msvcrt バージョンは、対応するバージョンの Windows SDK では言及されていません。
モダンは修飾する必要がありますが、「Windows SDK」の使用は、「プラットフォーム SDK」から名前が変更された後のすべての Windows SDK を参照することを示唆しています。そして、私はそれをすぐに信じる傾向があります。しかし、ポスターはスタンドアロンの Windows WDK (およびその前の DDK) を無視しています。これらは、それについて言及するだけでなくmsvcrt.dll
、CRT としても使用します。これらは、カーネルとユーザー モードの両方の開発を目的とした Microsoft の公式ツールチェーンです。
Microsoft は、公開されているか公開されていない最新のツールチェーンを使用して、CRT DLL を更新します (たとえば、Windows Media Player パッチをリリースする場合)。
そのとおりです。システム DLL にプロモートされているためmsvcrt.dll
、更新され続けます。これは、WDK を使用するときに信頼できるコントラクトです。パッチを適用しているという理由だけで、独自のツールチェーンで構築されたアプリケーションを壊すつもりはありません。msvcrt.dll
古い WDK コンパイラとライブラリを使用して Windows で msvcrt DLL をビルドしていないことを期待できます。
確かなことはわかりませんが、2010 年以降の公式のツールチェーンは、私が古代と呼ぶようなものではありません。さらに、Microsoft はその間に XP と 2003 のサポートを中止したため、Vista 以降のみをサポートする必要があります。これは、Windows 8 以降の WDK 用のコンパイラとツールを直接提供する最新の Visual C++ バージョンを使用すると、より簡単になります。
(なぜ古いのですか? WDK チームは、人々がコンパイラを使用して msvcrt にリンクすることを好まないため、バージョン 8.0 の抜け穴を削除して、それらの「賢い」人々を阻止しました)。
ああ、本当に、ドロンはリンクされたフォーラムの投稿で実際にそれを言っていますか? うーん、ダメ:
Windows CRT (msvcrt.dll) に対してリンクしたため、win7 wdk ビルドが正常に展開されました。サードパーティにこれ以上行わせたくない
ため、win8 wdk でその機能を削除しました。後方互換性のために引き続き機能します。正常に展開される可能性がありますが、正しい CRT を使用していることを確認する wck ロゴ チェックがある場合があります。
(私のものを強調)
この声明は、マイクロソフトが姿勢を変えるための「政治的決定」 (およびその公式決定) に関するものです。実際、「もう」というのは、これが Windows 8 WDK でのみ変更されたことを意味します。Visual C++ と再び統合された最初の最新の WDK (Windows 2000 DDK 以来)。そのため、WDK はスタンドアロン ツールチェーンから特定の Visual C++ バージョンと統合される拡張機能に降格されているため、新しい要件はまったく驚くべきことではありません。
msvcrt.dll
ところで、 CRT として使用するスタンドアロン WDK に関する提案がそのポリシー変更の前にあったときに、Windows 8 WDK 以降に基づいて議論するのも不誠実です。msvcrt.dll
また、システム DLL への昇格に至った経緯と、昇格後の時代を混同するのも不誠実です。
用語集
- CRT == C/C++ ランタイム
- 3790.1830 == Windows Server 2003 Service Pack 1 (SP1) ドライバー開発キット (DDK)
- 6001.18002 == Windows Server 2008/Vista 用 Windows Driver Kit SP1
- 7600.16385.1 == Windows Driver Kit バージョン 7.1.0 (Windows 7、Windows Vista、Windows XP、Windows Server 2008 R2、Windows Server 2008、Windows Server 2003 に対応)
TL;DR
この回答に反して、 msvcrt.dll
(XP..7 SP1) へのリンクを「ネイティブに」サポートするスタンドアロン WDK など、Microsoft 独自の変更されていないツールチェーンを使用してもまったく問題ありません。これらのツールチェーンに付属のドキュメントにも記載されています (インストールしないか目を閉じない限り:))。
ビルド時に正しい Windows バージョンをターゲットにすることを確認する必要があるのは"だけ" です(基本的に、正しい を定義するのと同じですWINVER
)。kernel32.dll
しかし、他のシステム DLL (例: user32.dll
...)についても同じことが言えます。
ただし、 2002 年以降の Visual C++を使用してリンクすると、必ず問題が発生します。混同しないでください。これらの特定の Visual C++ バージョンに一致する CRT を使用するだけです。msvcrt.dll