私はこれらの無関係なデバッグとリリースとx86、x64、Any CPUがほとんど人を殺したと思いました。
次のブログ投稿を読んで怖かったですが、モードを切り替えてプログラムをパスしたのも無理はありません。。。。
転載:
1.https://www.cnblogs.com/xxn-180727/p/9442992.html
2.https://www.cnblogs.com/netserver/p/11106130.html
1.デバッグとリリース
1.違い
デバッグデバッグバージョンでは、生成された.exeに多くのデバッグ情報が含まれます。パッケージが直接送信される場合、パッケージは比較的大きくなります。
リリースリリースバージョン
デバッグコンパイルにはマクロ定義_DEBUGがあります。_DEBUGがコードで定義されている場合はデバッグコンパイルを意味し、それ以外の場合はリリースです。
コンパイル。
次に、_WIN32および_WIN64
1.定義
_WIN32は32ビットのコンパイルで、_WIN64は64ビットのコンパイルです。
異なる桁数でコンパイルする理由は、ソフトウェアの汎用性を向上させるためです。まず、いくつかの常識を理解しましょう:
- コンピューターのオペレーティングシステムのビット数が異なる場合、コード内の基本的なデータ型が占めるバイトも異なります。
例:32ビットプラットフォームではlong longは8バイト(64ビット)、64ビットプラットフォームではlongは8バイト(64ビット)
- 64ビットのオペレーティングシステムは理論的には32ビットおよび64ビットのソフトウェアを実行できますが、32ビットのオペレーティングシステムは32ビットのソフトウェアしか実行できません。
それでは、ソフトウェアを異なるプラットフォームで実行するにはどうすればよいですか?メソッドはマクロ定義です。
例:#ifdef _WIN64
typedef long int int64_t;
#他
_extension_
typedefの長い長いint型int64_tの。
2. 32ビットコンパイルと64ビットコンパイルを区別する方法
Win32構成では、_WIN32が定義され、_WIN64は定義されません。x64構成では、両方が定義されています。
32ビットは64ビットをサポートしておらず、64ビットは32ビットと互換性があることがわかります。つまり、VCでは、_WIN32を定義する必要があります。
1 _WIN64 // 64ビット命令の#ifdefは実施例コンパイルさ
のtypedef 2 ロングロングintptr_tと、図3 の#else
4 _W64のtypedef。INT intptr_t; 5 #endifの
Visual Studioにおけるデバッグとリリース、x86、x64、Any CPUの違い
Visual Studioでのデバッグとリリースの違い:
Visual Studioには、デバッグモードとリリースモードの2つのコンパイルモードがあります。これはデフォルトの2つの方法でもあります。新しいプロジェクトを作成するとき、これらの2つのモードはすでに選択用に存在しています。
デバッグは通常、デバッグバージョンと呼ばれ、デバッグ情報が含まれ、最適化は行われません。これは、プログラマがプログラムをデバッグするのに便利です。
リリースはリリースバージョンと呼ばれ、多くの場合、最適化されているため、プログラムはコードサイズと実行速度が最適であり、ユーザーはそれを適切に使用できます。
SO:
一般に、Releaseはパッケージ化とリリースプログラムに使用されます。これは、Releaseがより多くの最適化を行い、より高速に実行されるためです。これは、プロジェクトの完了後の展開に適しています。さらに、Releaseによってパッケージ化されるプログラムファイルは比較的小さくなります。デバッグモードは、開発とデバッグにより適しています。つまり、開発およびデバッグ時にはデバッグモードを使用し、プログラムのパッケージ化と公開にはリリースモードを使用します。
Visual Studioにおけるx86、x64、Any CPUの違い:
1.簡単に言うと、両者の最も直接的な違いは、x86プラットフォームでコンパイルされたexe(実行可能ファイル)またはdll(ダイナミックリンクライブラリ)がすべて32ビットであることです。x64は64ビットに対応します。Any CPUは、現在のオペレーティングシステムによって異なります。オペレーティングシステムが32ビットの場合、コンパイルされたプログラムは32ビットです。オペレーティングシステムが64ビットの場合、コンパイルされたプログラムは64ビットプログラムです。
2.スタートアッププロジェクト、メインプログラム(exeファイルとしてコンパイル)がx86プラットフォームでコンパイルされ、依存するプロジェクト(またはダイナミックリンクライブラリ)がx64プラットフォームでコンパイルされる場合、 「ファイルまたはアセンブリをロードできませんでした...またはその依存関係の1つ。不正な形式でプログラムをロードしようとしました。」などのエラー。これは、32ビットプログラムが64ビットdllをロードできず、クラス、メソッド、オブジェクトを呼び出すことができないためです。
逆に、メインプログラムがx64プラットフォームからコンパイルされ、dllがx86の場合はどうなりますか?答え。。良くない!
そういえば、基本的に1つのことを決定できます。dllの生成プラットフォームとメインプログラムが一致している限りです。
それから質問が来ています!メインプログラムがAny CPUでコンパイルされ、dllがx86またはx64プラットフォームでコンパイルされている場合、またはメインプログラムがx86またはx64プラットフォームでコンパイルされており、dllがAny CPUでコンパイルされている場合はどうなりますか?正解は、「特別な状況」ではどちらも可能であるということです。なぜ「特別な場合」なのですか?最初の点も言及されているため、どのCPUもオペレーティングシステムに依存し、2番目の点で言及されているように、dllとメインプログラム生成プラットフォームが同じである限り、それも可能です。したがって、上記から、メインプログラムがAny CPUプラットフォームでコンパイルされる場合、dllをコンパイルするためのプラットフォームは、メインプログラムをコンパイルするためのオペレーティングシステムと一致している必要があります。メインプログラムがx86またはx64プラットフォームでコンパイルされている場合、dllはメインプログラムと一致している必要があります。ただし、特殊なケースがあります。dllがAny CPUによってコンパイルされる場合、dllは32ビットおよび64ビットのメインプログラムから呼び出すことができます。これはなぜですか?3点目をご覧ください。
3. Any CPUでコンパイルされたプログラムはオペレーティングシステムに依存しますが、Any CPUでコンパイルされたdllはそれを呼び出すメインプログラムに依存します。つまり、メインプログラムが32ビットの場合、dllも32ビットです。メインプログラムが64ビットの場合、DLLは64ビットです。したがって、dllは一般にAny CPUプラットフォームを使用してコンパイルされ、メインプログラム(exe)は一般にx86プラットフォームを使用してコンパイルされます。
概要:それらの違いを理解した後、プログラムをパッケージ化するときの選択方法がわかります。一般的に言って、顧客のコンピューターがどちらのタイプのオペレーティングシステム、またはその両方であるかが不明な場合、メインプログラムはx86プラットフォームでコンパイルされ、dllはAny CPUプラットフォームでコンパイルされます。64ビットオペレーティングシステムであることが明らかな場合は、すべてx64プラットフォームでコンパイルできます。
Visual Studioでのデバッグとリリースの違い:
Visual Studioには、デバッグモードとリリースモードの2つのコンパイルモードがあります。これはデフォルトの2つの方法でもあります。新しいプロジェクトを作成するとき、これらの2つのモードはすでに選択用に存在しています。
デバッグは通常、デバッグバージョンと呼ばれ、デバッグ情報が含まれ、最適化は行われません。これは、プログラマがプログラムをデバッグするのに便利です。
リリースはリリースバージョンと呼ばれ、多くの場合、最適化されているため、プログラムはコードサイズと実行速度が最適であり、ユーザーはそれを適切に使用できます。
SO:
一般に、Releaseはパッケージ化とリリースプログラムに使用されます。これは、Releaseがより多くの最適化を行い、より高速に実行されるためです。これは、プロジェクトの完了後の展開に適しています。さらに、Releaseによってパッケージ化されるプログラムファイルは比較的小さくなります。デバッグモードは、開発とデバッグにより適しています。つまり、開発およびデバッグ時にはデバッグモードを使用し、プログラムのパッケージ化と公開にはリリースモードを使用します。
Visual Studioにおけるx86、x64、Any CPUの違い:
1.簡単に言うと、両者の最も直接的な違いは、x86プラットフォームでコンパイルされたexe(実行可能ファイル)またはdll(ダイナミックリンクライブラリ)がすべて32ビットであることです。x64は64ビットに対応します。Any CPUは、現在のオペレーティングシステムによって異なります。オペレーティングシステムが32ビットの場合、コンパイルされたプログラムは32ビットです。オペレーティングシステムが64ビットの場合、コンパイルされたプログラムは64ビットプログラムです。
2.スタートアッププロジェクト、メインプログラム(exeファイルとしてコンパイル)がx86プラットフォームでコンパイルされ、依存するプロジェクト(またはダイナミックリンクライブラリ)がx64プラットフォームでコンパイルされる場合、 「ファイルまたはアセンブリをロードできませんでした...またはその依存関係の1つ。不正な形式でプログラムをロードしようとしました。」などのエラー。これは、32ビットプログラムが64ビットdllをロードできず、クラス、メソッド、オブジェクトを呼び出すことができないためです。
逆に、メインプログラムがx64プラットフォームからコンパイルされ、dllがx86の場合はどうなりますか?答え。。良くない!
そういえば、基本的に1つのことを決定できます。dllの生成プラットフォームとメインプログラムが一致している限りです。
それから質問が来ています!メインプログラムがAny CPUでコンパイルされ、dllがx86またはx64プラットフォームでコンパイルされている場合、またはメインプログラムがx86またはx64プラットフォームでコンパイルされており、dllがAny CPUでコンパイルされている場合はどうなりますか?正解は、「特別な状況」ではどちらも可能であるということです。なぜ「特別な場合」なのですか?最初の点も言及されているため、どのCPUもオペレーティングシステムに依存し、2番目の点で言及されているように、dllとメインプログラム生成プラットフォームが同じである限り、それも可能です。したがって、上記から、メインプログラムがAny CPUプラットフォームでコンパイルされる場合、dllをコンパイルするためのプラットフォームは、メインプログラムをコンパイルするためのオペレーティングシステムと一致している必要があります。メインプログラムがx86またはx64プラットフォームでコンパイルされている場合、dllはメインプログラムと一致している必要があります。ただし、特殊なケースがあります。dllがAny CPUによってコンパイルされる場合、dllは32ビットおよび64ビットのメインプログラムから呼び出すことができます。これはなぜですか?3点目をご覧ください。
3. Any CPUでコンパイルされたプログラムはオペレーティングシステムに依存しますが、Any CPUでコンパイルされたdllはそれを呼び出すメインプログラムに依存します。つまり、メインプログラムが32ビットの場合、dllも32ビットです。メインプログラムが64ビットの場合、DLLは64ビットです。したがって、dllは一般にAny CPUプラットフォームを使用してコンパイルされ、メインプログラム(exe)は一般にx86プラットフォームを使用してコンパイルされます。
概要:それらの違いを理解した後、プログラムをパッケージ化するときの選択方法がわかります。一般的に言って、顧客のコンピューターがどちらのタイプのオペレーティングシステム、またはその両方であるかが不明な場合、メインプログラムはx86プラットフォームでコンパイルされ、dllはAny CPUプラットフォームでコンパイルされます。64ビットオペレーティングシステムであることが明らかな場合は、すべてx64プラットフォームでコンパイルできます。