2008-09-28 47 views
63

Tôi đang viết một số mã bán di động và muốn có thể phát hiện khi tôi biên dịch cho iPhone. Vì vậy, tôi muốn một cái gì đó như #ifdef IPHONE_SDK....#defines được thiết lập bởi Xcode khi biên dịch cho iPhone

Có lẽ Xcode xác định điều gì đó, nhưng tôi không thể thấy bất kỳ điều gì trong thuộc tính dự án và Google không giúp được gì nhiều.

Trả lời

111

Đó là trong các tài liệu SDK dưới "Biên dịch mã nguồn có điều kiện"

Các định nghĩa liên quan là TARGET_OS_IPHONE (và ông bị phản đối TARGET_IPHONE_SIMULATOR), được định nghĩa trong /usr/include/TargetConditionals.h trong khuôn khổ iOS. Trên các phiên bản trước của chuỗi công cụ, bạn phải viết:

#include "TargetConditionals.h" 

nhưng điều này không còn cần thiết trên chuỗi công cụ hiện tại (xCode 6/iOS8).

Vì vậy, ví dụ, nếu bạn chỉ muốn biên dịch một khối mã nếu bạn đang xây dựng cho thiết bị, sau đó bạn nên làm

#if !(TARGET_OS_SIMULATOR) 
... 
#endif 
+0

bao gồm điều kiện mục tiêu được chính xác điều đúng đắn, sau đó sử dụng #ifdef TARGET_OS_IPHONE – kritzikratzi

+3

@kritzikratzi: #ifdef là sai rồi; bạn phải sử dụng #if. (Biểu tượng thường được định nghĩa là 0 khi không có trên trình mô phỏng; #ifdef sẽ vẫn đúng.) – Andrew

+2

Đối với những người bạn cũng nghĩ TARGET_OS_IPHONE là một cách phát hiện thiết bị, nó không phải. Nó có nghĩa là bạn đang trên iOS, có thể là giả lập hoặc iphone. TARGET_IPHONE_SIMULATOR là cách phát hiện thiết bị so với trình mô phỏng. (Tôi biết nó không ngụ ý trong câu trả lời nhưng nhìn thấy IPHONE ở đó dẫn đến lỗi của tôi) –

24

Để xem xét tất cả các macro được xác định, thêm video này vào các "Cờ C khác" của cấu hình bản dựng của bạn:

-g3 -save-temps -dD 

Bạn sẽ gặp phải một số lỗi xây dựng, nhưng trình biên dịch sẽ đổ tất cả các định dạng vào tệp .mi trong thư mục gốc của dự án. Bạn có thể sử dụng grep để xem chúng, ví dụ:

grep define main.mi 

Khi bạn hoàn tất, đừng quên xóa các tùy chọn này khỏi cài đặt xây dựng.

+0

Cảm ơn, điều này hữu ích –

+0

Tuyệt vời! Cảm ơn vì điều đó. –

+4

lưu ý rằng điều này không hoạt động khi sử dụng trình biên dịch LLVM –

0

Câu trả lời cho câu hỏi này không hoàn toàn chính xác. Câu hỏi của nền tảng và phần cứng vs Simulator là trực giao.

Không sử dụng kiến ​​trúc làm phím tắt để phát hiện nền tảng hoặc trình mô phỏng! Đây là loại suy nghĩ cẩu thả đã gây ra nhiều, nhiều lập trình viên rất nhiều chứng ợ nóng và đau đầu trong những năm qua.

Dưới đây là biểu đồ ASCII về các điều kiện. Các tên không nhất thiết có ý nghĩa vì những lý do lịch sử:

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

Devices:  TARGET_OS_EMBEDDED 
Simulators: TARGET_OS_SIMULATOR 

TARGET_OS_MAC là đúng cho tất cả các nền tảng của Apple.


TARGET_OS_OSX là đúng chỉ dành cho hệ điều hành MacOS

TARGET_OS_IPHONE là đúng đối với iOS, watchos, và tvOS (thiết bị & mô phỏng)


TARGET_OS_IOS là đúng chỉ dành cho iOS (thiết bị & mô phỏng)

TARGET_OS_WATCH chỉ đúng cho watchOS (thiết bị & trình mô phỏng)

TARGET_OS_TV chỉ đúng cho tvOS (thiết bị & mô phỏng)


TARGET_OS_EMBEDDED chỉ đúng cho phần cứng iOS/watchos/tvOS

TARGET_OS_SIMULATOR chỉ đúng cho Simulator.


tôi cũng sẽ lưu ý rằng bạn có thể thiết lập conditionalize trong xcconfig file theo nền tảng:

//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*] = ...