Intel/Apple 실리콘 대응 Universal 바이너리를 만들어 보았다
3785 단어 macosAppleSilicon
Universal 바이너리란?
Apple사가 WWDC20에서 새로운 macOS의 버전 macOS 11 Big Sur의 발표와 함께 자사 설계의 Arm 기반의 칩(Apple 실리콘)을 Mac에 탑재하는 것도 발표했다.
지금까지 인텔의 칩에서 애플 실리콘의 이행을 보다 원활하게 하기 위해 애플은 파워PC에서 인텔로의 이행 때와 마찬가지로 두 가지 툴을 발표했다. 하나는 인텔용 바이너리를 ARM용으로 동적으로 변환하는 프로그램 Rosetta2. 그리고 또 하나가 Intel, ARM 양쪽에서 실행할 수 있는 Universal 바이너리.
이번에는 Xcode12로 Universal 바이너리를 빌드하는 방법과 바이너리가 어느 아키텍처에 대응하고 있는지 확인하는 방법을 소개한다.
Universal 바이너리를 빌드하는 방법
Apple 개발자 계정에서 Xcode12를 다운로드하여 기존 XCode 프로젝트를 엽니다.
프로젝트 설정 화면에서 빌드할 애플리케이션의 빌드 설정을 표시합니다.
"Architectures"라는 항목의 옵션에서 "Standard Architectures (64-Bit Intel and ARM)"를 선택합니다.
빌드 타겟을 “Any Mac(Apple Silicon, Intel)”을 선택하여 Universal 바이너리를 빌드한다.
이번 빌드하는 것은 프리프로세서 매크로로 IntelMac, AppleSiliconMac로 다른 캐릭터 라인이 출력되는 간단한 분기 처리가 실장되고 있는 커맨드 라인 툴이다.
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
#if defined(__x86_64__)
printf("Arch is x86_64\n");
#elif defined(__aarch64__)
printf("Arch is Arm64\n");
#else
printf("Unknown architecture\n");
#endif
return 0;
}
빌드 타겟을 "My Mac"로 빌드한 Intel용 바이너리와 비교해 보면 Universal 바이너리가 2배 정도 컸다.
Intel용의 실행 코드와 AppleSilicon용의 실행 코드가 파일에 격납되어 있으므로 Universal 바이너리는 2배의 사이즈가 되어 있다.
바이너리 대응 아키텍처 확인 방법
바이너리가 x86_64와 ARM 모두에서 실행할 수있는 유니버설 바이너리인지 확인하려면 명령 줄 도구의 lipo를 사용하십시오.
대응 아키텍쳐를 조사하려면 옵션의 「-archs」를 더해 실행한다.
lipo -archs バイナリーへのパス
명령은 "lipo -archs 바이너리 경로". 다음과 같은 대답이 표시됩니다.
Universal 빌드한 바이너리는 x86과 ARM의 양 아키텍처에 대응하고 있는 것을 알 수 있다.
마지막으로 툴이 Intel, AppleSilicon 환경에서 다른 문자열을 출력하는 것을 확인했다.
인텔 환경
AppleSilicon 환경
환경에 의존하는 코드는 프리프로세서 매크로로 나눌 수 있는 것이 편리하기 때문에 기억해 두자!
Reference
이 문제에 관하여(Intel/Apple 실리콘 대응 Universal 바이너리를 만들어 보았다), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/spc_gmorimoto/items/216565049c683bfa5d35
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Apple 개발자 계정에서 Xcode12를 다운로드하여 기존 XCode 프로젝트를 엽니다.
프로젝트 설정 화면에서 빌드할 애플리케이션의 빌드 설정을 표시합니다.
"Architectures"라는 항목의 옵션에서 "Standard Architectures (64-Bit Intel and ARM)"를 선택합니다.
빌드 타겟을 “Any Mac(Apple Silicon, Intel)”을 선택하여 Universal 바이너리를 빌드한다.
이번 빌드하는 것은 프리프로세서 매크로로 IntelMac, AppleSiliconMac로 다른 캐릭터 라인이 출력되는 간단한 분기 처리가 실장되고 있는 커맨드 라인 툴이다.
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
#if defined(__x86_64__)
printf("Arch is x86_64\n");
#elif defined(__aarch64__)
printf("Arch is Arm64\n");
#else
printf("Unknown architecture\n");
#endif
return 0;
}
빌드 타겟을 "My Mac"로 빌드한 Intel용 바이너리와 비교해 보면 Universal 바이너리가 2배 정도 컸다.
Intel용의 실행 코드와 AppleSilicon용의 실행 코드가 파일에 격납되어 있으므로 Universal 바이너리는 2배의 사이즈가 되어 있다.
바이너리 대응 아키텍처 확인 방법
바이너리가 x86_64와 ARM 모두에서 실행할 수있는 유니버설 바이너리인지 확인하려면 명령 줄 도구의 lipo를 사용하십시오.
대응 아키텍쳐를 조사하려면 옵션의 「-archs」를 더해 실행한다.
lipo -archs バイナリーへのパス
명령은 "lipo -archs 바이너리 경로". 다음과 같은 대답이 표시됩니다.
Universal 빌드한 바이너리는 x86과 ARM의 양 아키텍처에 대응하고 있는 것을 알 수 있다.
마지막으로 툴이 Intel, AppleSilicon 환경에서 다른 문자열을 출력하는 것을 확인했다.
인텔 환경
AppleSilicon 환경
환경에 의존하는 코드는 프리프로세서 매크로로 나눌 수 있는 것이 편리하기 때문에 기억해 두자!
Reference
이 문제에 관하여(Intel/Apple 실리콘 대응 Universal 바이너리를 만들어 보았다), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/spc_gmorimoto/items/216565049c683bfa5d35
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
lipo -archs バイナリーへのパス
Reference
이 문제에 관하여(Intel/Apple 실리콘 대응 Universal 바이너리를 만들어 보았다), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/spc_gmorimoto/items/216565049c683bfa5d35텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)