CPU 아키텍처 컴파일 시간 탐지
C 또는 C++ 코드를 컴파일할 때 CPU 아키텍처를 알아내는 가장 신뢰할 수 있는 방법은 무엇인가?내가 말할 수 있는 한, 다른 컴파일러들은 그들만의 비표준 전처리기 정의 세트를 가지고 있다._M_X86
MSVS에서는__i386__
,__arm__
GCC 등에서.
내가 짓고 있는 건축물을 탐지할 수 있는 표준적인 방법이 있을까?그렇지 않다면, 모든 보일러가 있는 헤더와 같은 다양한 컴파일러에 대한 그러한 정의의 포괄적인 목록을 제공하는 출처가 있는가?#ifdef
s?
즐겨라, 나는 이 책의 원저자였다.
extern "C" {
const char *getBuild() { //Get current architecture, detectx nearly every architecture. Coded by Freak
#if defined(__x86_64__) || defined(_M_X64)
return "x86_64";
#elif defined(i386) || defined(__i386__) || defined(__i386) || defined(_M_IX86)
return "x86_32";
#elif defined(__ARM_ARCH_2__)
return "ARM2";
#elif defined(__ARM_ARCH_3__) || defined(__ARM_ARCH_3M__)
return "ARM3";
#elif defined(__ARM_ARCH_4T__) || defined(__TARGET_ARM_4T)
return "ARM4T";
#elif defined(__ARM_ARCH_5_) || defined(__ARM_ARCH_5E_)
return "ARM5"
#elif defined(__ARM_ARCH_6T2_) || defined(__ARM_ARCH_6T2_)
return "ARM6T2";
#elif defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_6J__) || defined(__ARM_ARCH_6K__) || defined(__ARM_ARCH_6Z__) || defined(__ARM_ARCH_6ZK__)
return "ARM6";
#elif defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7A__) || defined(__ARM_ARCH_7R__) || defined(__ARM_ARCH_7M__) || defined(__ARM_ARCH_7S__)
return "ARM7";
#elif defined(__ARM_ARCH_7A__) || defined(__ARM_ARCH_7R__) || defined(__ARM_ARCH_7M__) || defined(__ARM_ARCH_7S__)
return "ARM7A";
#elif defined(__ARM_ARCH_7R__) || defined(__ARM_ARCH_7M__) || defined(__ARM_ARCH_7S__)
return "ARM7R";
#elif defined(__ARM_ARCH_7M__)
return "ARM7M";
#elif defined(__ARM_ARCH_7S__)
return "ARM7S";
#elif defined(__aarch64__) || defined(_M_ARM64)
return "ARM64";
#elif defined(mips) || defined(__mips__) || defined(__mips)
return "MIPS";
#elif defined(__sh__)
return "SUPERH";
#elif defined(__powerpc) || defined(__powerpc__) || defined(__powerpc64__) || defined(__POWERPC__) || defined(__ppc__) || defined(__PPC__) || defined(_ARCH_PPC)
return "POWERPC";
#elif defined(__PPC64__) || defined(__ppc64__) || defined(_ARCH_PPC64)
return "POWERPC64";
#elif defined(__sparc__) || defined(__sparc)
return "SPARC";
#elif defined(__m68k__)
return "M68K";
#else
return "UNKNOWN";
#endif
}
}
사용 가능한 모든 기능을 특정 플랫폼에 덤프하려면 다음과 같이 GCC를 실행하십시오.
gcc -march=native -dM -E - </dev/null
그렇게 매크로를 버릴 거야#define __SSE3__ 1
,#define __AES__ 1
등
컴파일러 간 표준은 없지만 각 컴파일러는 상당히 일관된 경향이 있다.머리글을 직접 만들 수 있는 방법은 다음과 같다.
#if MSVC
#ifdef _M_X86
#define ARCH_X86
#endif
#endif
#if GCC
#ifdef __i386__
#define ARCH_X86
#endif
#endif
수천 개의 컴파일러가 있지만 널리 사용되는 컴파일러(Microsoft C++, GCC, Intel CC, TenDRA?)는 3-4개에 불과하기 때문에 포괄적인 목록에는 별로 의미가 없다.응용 프로그램에서 지원할 컴파일러를 결정하고, #defines를 나열하고, 필요에 따라 머리글을 업데이트하십시오.
그 리스트가 있다.#define
s. 이전에 이 링크가 포함된 높은 투표율의 답변이 있었지만 SO의 "발신자는 반드시 코드를 가져야 한다"는 규칙으로 인해 삭제된 것으로 추정된다.여기 랜덤 표본을 보시죠.전체 목록을 보려면 링크를 클릭하십시오.
AMD64
유형 | 매크로 | 설명 |
---|---|---|
식별 | __amd64__ __amd64 __x86_64__ __x86_64 |
GNU C 및 Sun Studio에 의해 정의됨 |
식별 | _M_X64 _M_AMD64 |
Visual Studio에서 정의 |
교차 컴파일러 솔루션을 원한다면 다음 구성 요소를 사용하십시오.
BOOST_ARCH_
컴파일 중인 시스템/CPU 아키텍처의 경우BOOST_COMP_
컴파일러를 위해 사용할 수 있다.BOOST_LANG_
언어 표준에 대해 편찬하고 있다.BOOST_LIB_C_
및 BUUST_LIB_사용 중인 C 및 C++ 표준 라이브러리의 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은 "휴대용 오픈 소스 하니스"에 이 많은 것들을 기록했고, 심지어 그것들을 일관성 있고 사용 가능한 것으로 만들려고 노력한다.이 사이트의 posh.h 헤더를 참조하십시오.
참고, 위의 링크는 얼마 전 DOS 공격으로 인해 가짜 사용자 ID/암호를 입력해야 할 수 있다.
CPU 기능에 대한 세밀한 탐지가 필요한 경우, 가장 좋은 방법은 stdout 또는 일부 "cpu_config"로 출력되는 CPUID 프로그램도 배송하는 것이다.h"는 CPU에서 지원되는 기능 집합을 파일로 저장한다.그런 다음 그 프로그램을 빌드 프로세스와 통합하십시오.
참조URL: https://stackoverflow.com/questions/152016/detecting-cpu-architecture-compile-time
'Programing' 카테고리의 다른 글
Vue + Vuex 프로젝트 구조화 (0) | 2022.05.19 |
---|---|
C용 컨테이너 클래스 / 라이브러리 (0) | 2022.05.19 |
vue에서 {ref}을(를) 가져오는 동안 오류가 발생하는 중? (0) | 2022.05.19 |
사용자 정의 유효성 검사 규칙이 작동하지 않음 (0) | 2022.05.19 |
선택 항목을 사용할 때 문자열이 아닌 부울을 반환하는 방법 (0) | 2022.05.19 |