質問

CまたはC ++コードをコンパイルするときにCPUアーキテクチャを見つける最も信頼できる方法は何ですか?私が知る限り、異なるコンパイラは独自の非標準プリプロセッサ定義のセットを持っています(MSVSの _M_X86 、GCCの __ i386 __ __ arm __ など)。

構築しようとしているアーキテクチャを検出するための標準の方法はありますか?そうでない場合、すべての定型的な #ifdef sを含むヘッダーなど、さまざまなコンパイラーの定義の包括的なリストのソースはありますか?

役に立ちましたか?

解決

事前定義アーキテクチャマクロおよびその他の種類のpre定義マクロ。

この質問定義されている場所を尋ねる GCCソースコード内。

他のヒント

コンパイラー間標準はありませんが、各コンパイラーはかなり一貫している傾向があります。次のようなヘッダーを自分で作成できます。

#if MSVC
#ifdef _M_X86
#define ARCH_X86
#endif
#endif

#if GCC
#ifdef __i386__
#define ARCH_X86
#endif
#endif

何千ものコンパイラーがありますが、広範囲に使用されているのは3〜4のみであるため(Microsoft C ++、GCC、Intel CC、TenDRAなど)、包括的なリストにはあまり意味がありません。アプリケーションがサポートするコンパイラを決定し、それらの#definesをリストし、必要に応じてヘッダーを更新するだけです。

特定のプラットフォームで利用可能なすべての機能をダンプする場合は、次のようにGCCを実行できます。

gcc -march=native -dM -E - </dev/null

#define __SSE3__ 1 #define __AES__ 1 などのマクロをダンプします。

クロスコンパイラソリューションが必要な場合は、を使用します。 Boost.Predef には以下が含まれています

    コンパイル対象のシステム/ CPUアーキテクチャ用の
  • BOOST_ARCH _
  • 使用しているコンパイラの
  • BOOST_COMP _
  • コンパイル対象の言語標準の
  • BOOST_LANG _
  • 使用中のCおよびC ++標準ライブラリの
  • BOOST_LIB_C _ およびBOOST_LIB_STD _。
  • コンパイルするオペレーティングシステムの
  • BOOST_OS _
  • BOOST_PLAT _ は、オペレーティングシステムまたはコンパイラ上のプラットフォーム用です。
  • OSとアーキテクチャの組み合わせのエンディアンのための
  • BOOST_ENDIAN _
  • ハードウェア固有の機能については、
  • BOOST_HW _
  • SIMD(単一命令複数データ)検出用の
  • BOOST_HW_SIMD

たとえば

#if defined(BOOST_ARCH_X86)
    #if BOOST_ARCH_X86_64
        std::cout << "x86_64 " << BOOST_ARCH_X86_64 << " \n";
    #elif BOOST_ARCH_X86_32
        std::cout << "x86 " << BOOST_ARCH_X86_32 << " \n";
    #endif
#elif defined(BOOST_ARCH_ARM)
    #if _M_ARM
        std::cout << "ARM " << _M_ARM << " \n";
    #elif _M_ARM64
        std::cout << "ARM64 " << _M_ARM64 << " \n";
    #endif
#endif

使用方法の詳細については、こちら

標準はありません。 Brian Hookはこれらの束を「Portable Open Source Harness」で文書化し、一貫性のある使いやすいものにしようとしています(それに関するymmv)。このサイトのposh.hヘッダーを参照してください。

上記のリンクでは、しばらく前のDOS攻撃のために、偽のユーザーID /パスワードを入力する必要がある場合があります。

CPU機能のきめ細かい検出が必要な場合、最善の方法は、stdoutまたは一部の「cpu_config.h」に出力するCPUIDプログラムも同梱することです。 CPUがサポートする機能のセットを提出します。次に、そのプログラムをビルドプロセスに統合します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top