문제

C 또는 C ++ 코드를 컴파일 할 때 CPU 아키텍처를 찾는 가장 신뢰할 수있는 방법은 무엇입니까? 내가 알 수있는 한, 다른 컴파일러는 자체 비표준 비표준 사전 처리기 정의 세트를 가지고 있습니다 (_M_X86 MSV에서 __i386__, __arm__ GCC 등).

a 기준 내가 건축하는 건축물을 감지하는 방법? 그렇지 않은 경우 모든 보일러 플레이트가있는 헤더와 같은 다양한 컴파일러에 대한 이러한 정의의 포괄적 인 목록에 대한 소스가 있습니까? #ifdef에스?

도움이 되었습니까?

해결책

다음은 몇 가지 정보입니다 사전 정의 된 아키텍처 매크로 및 기타 유형의 사전 정의 된 매크로.

이 질문 그들이 어디에 정의되는지 묻습니다 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, 아마도 tindra?). 응용 프로그램이 지원할 컴파일러를 결정하고 #Defines를 나열하고 필요에 따라 헤더를 업데이트하십시오.

특정 플랫폼에 사용 가능한 모든 기능을 덤프하려면 다음과 같은 GCC를 실행할 수 있습니다.

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

마크로와 같은 매크로를 버릴 것입니다 #define __SSE3__ 1, #define __AES__ 1, 등.

크로스 컴필라 솔루션을 원한다면 사용하십시오 Boost.Predef 포함하는

  • BOOST_ARCH_ 시스템/CPU 아키텍처의 경우 하나를 컴파일하고 있습니다.
  • BOOST_COMP_ 컴파일러의 경우 사용 중입니다.
  • BOOST_LANG_ 언어 표준의 경우 하나는 컴파일 중입니다.
  • BOOST_LIB_C_ 및 사용중인 C 및 C ++ 표준 라이브러리의 경우 roost_lib_std_.
  • BOOST_OS_ 운영 체제를 위해 우리는 컴파일하고 있습니다.
  • BOOST_PLAT_ 운영 체제 또는 컴파일러 위에있는 플랫폼 용.
  • BOOST_ENDIAN_ OS 및 아키텍처 조합의 엔지니어를 위해.
  • BOOST_HW_ 하드웨어 특정 기능의 경우.
  • BOOST_HW_SIMD 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)은 그의 "휴대용 오픈 소스 하네스"에 이것들을 문서화했으며 심지어 일관적이고 사용 가능한 것으로 만들려고 시도합니다 (YMMV). 이 사이트의 Posh.h 헤더를 참조하십시오.

위의 링크는 얼마 전에 DOS 공격으로 인해 가짜 사용자 ID/비밀번호를 입력해야 할 수도 있습니다.

CPU 기능을 세밀하게 감지 해야하는 경우 가장 좋은 방법은 CPU가 지원하는 기능 세트를 STDOUT 또는 일부 "CPU_CONFIG.H"로 출력하는 CPUID 프로그램을 배송하는 것입니다. 그런 다음 해당 프로그램을 빌드 프로세스와 통합합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top