developer tip

iPhone 용으로 컴파일 할 때 Xcode에서 설정하는 #defines

copycodes 2020. 11. 20. 09:06
반응형

iPhone 용으로 컴파일 할 때 Xcode에서 설정하는 #defines


반 이식 가능한 코드를 작성 중이며 iPhone 용으로 컴파일 할 때 감지 할 수 있기를 원합니다. 그래서 나는 같은 것을 원한다 #ifdef IPHONE_SDK....

아마도 Xcode는 무언가를 정의하지만 프로젝트 속성 아래에서 아무것도 볼 수 없으며 Google은별로 도움이되지 않습니다.


"조건부로 소스 코드 컴파일"아래의 SDK 문서에 있습니다.

관련 정의는 TARGET_OS_IPHONE (그리고 TARGET_IPHONE_SIMULATOR는 더 이상 사용되지 않음)이며 iOS 프레임 워크 내의 /usr/include/TargetConditionals.h에 정의되어 있습니다. 이전 버전의 도구 모음에서는 다음을 작성해야했습니다.

#include "TargetConditionals.h"

그러나 이것은 현재 (xCode 6 / iOS8) 툴체인에서 더 이상 필요하지 않습니다.

예를 들어 장치 용으로 빌드하는 경우에만 코드 블록을 컴파일하려면 다음을 수행해야합니다.

#if !(TARGET_OS_SIMULATOR)
...
#endif

정의 된 모든 매크로를 보려면 빌드 구성의 "기타 C 플래그"에 다음을 추가하십시오.

-g3 -save-temps -dD

빌드 오류가 발생하지만 컴파일러는 모든 정의를 프로젝트의 루트 디렉토리에있는 .mi 파일로 덤프합니다. grep을 사용하여 볼 수 있습니다. 예를 들면 다음과 같습니다.

grep define main.mi 

완료되면 빌드 설정에서 이러한 옵션을 제거하는 것을 잊지 마십시오.


이 질문에 대한 답은 정확하지 않습니다. 플랫폼 및 하드웨어 대 시뮬레이터의 문제는 직교합니다.

아키텍처를 플랫폼 또는 시뮬레이터 감지의 지름길로 사용하지 마십시오! 이런 종류의 엉성한 사고는 수년 동안 많은 프로그래머들에게 엄청난 가슴 쓰림과 두통을 일으켰습니다.

다음은 조건부의 ASCII 차트입니다. 이름은 역사적인 이유로 반드시 의미가있는 것은 아닙니다.

+--------------------------------------+
|             TARGET_OS_MAC            |
| +---+  +---------------------------+ |
| |   |  |      TARGET_OS_IPHONE     | |
| |OSX|  | +-----+ +----+ +-------+  | |
| |   |  | | IOS | | TV | | WATCH |  | |
| |   |  | +-----+ +----+ +-------+  | |
| +---+  +---------------------------+ |
+--------------------------------------+

Devices:      TARGET_OS_EMBEDDED
Simulators:   TARGET_OS_SIMULATOR

TARGET_OS_MAC는 모든 Apple 플랫폼에 적용됩니다.


TARGET_OS_OSX는 macOS에서만 true입니다.

TARGET_OS_IPHONE은 iOS, watchOS 및 tvOS (기기 및 시뮬레이터)에 해당됩니다.


TARGET_OS_IOS는 iOS (기기 및 시뮬레이터)에만 해당됩니다.

TARGET_OS_WATCH는 watchOS (기기 및 시뮬레이터)에서만 true입니다.

TARGET_OS_TV는 tvOS (장치 및 시뮬레이터)에만 해당됩니다.


TARGET_OS_EMBEDDED는 iOS / watchOS / tvOS 하드웨어에만 해당됩니다.

TARGET_OS_SIMULATOR는 시뮬레이터에 대해서만 참입니다.


또한 xcconfig플랫폼별로 파일의 설정을 조건화 할 수 있습니다.

//macOS only
SOME_SETTING[sdk=macosx] = ...

//iOS (device & simulator)
SOME_SETTING[sdk=iphone*] = ...
//iOS (device)
SOME_SETTING[sdk=iphoneos*] = ...
//iOS (simulator)
SOME_SETTING[sdk=iphonesimulator*] = ...

//watchOS (device & simulator)
SOME_SETTING[sdk=watch*] = ...
//watchOS (device)
SOME_SETTING[sdk=watchos*] = ...
//watchOS (simulator)
SOME_SETTING[sdk=watchsimulator*] = ...

//tvOS (device & simulator)
SOME_SETTING[sdk=appletv*] = ...
//tvOS (device)
SOME_SETTING[sdk=appletvos*] = ...
//tvOS (simulator)
SOME_SETTING[sdk=appletvsimulator*] = ...

// iOS, tvOS, or watchOS Simulator
SOME_SETTING[sdk=embeddedsimulator*] = ...

참고 URL : https://stackoverflow.com/questions/146986/what-defines-are-set-up-by-xcode-when-compiling-for-iphone

반응형