Swift 有獨立使用的編譯器,透過 swiftc main.swift
可以很直接的編譯 Swift 程式碼,更可以使用 Swift Package 來作為 executable 的專案管理,但是 Objective-C 的編譯方法卻與 Swift 大不一樣,在開始學習 Objective-C 語法之前,我們先拿好釣竿,練習如何自己編譯並執行 Objective–C 程式碼!
Objective-C 實際上是 C 語言的衍生語言,所以我們可以用與 C 語言相似的編譯器 gcc
來編譯 Objective-C 的 .m
檔。
在 C 語言中,可以使用 clang
作為編譯程式,並提供相關的 .c
檔作為程式碼來源,而使用 -o
的 flag 作為產出程式的指定名稱。而產出的檔案則自動成為 executable 的二進制執行檔 ( u+x ),可以加入到 usr\bin
作為一個可以在 Command line 呼叫的指令。
# bash
# C 語言編譯指令,會在指定路徑(./main)複寫執行檔
clang main.c -o ./main
# 該執行檔會直接加上 u+x 的權限,可以直接使用
./main
而在 C 語言的專案中,像 Xcode 的 .xcodeproj
的專案檔是由 Makefile
所管理的,你可以在 GitHub 的 Basic C main
資料夾內找到該檔案,該檔案內的編譯指令是針對 Objective–C。
由於是與 C 語言使用同一個編譯程式,我需要特別小心處理,透過 -lobjc
指定程式語言是 Objective–C;由於 Objective-C 的許多物件導向工具都需要使用 Foundation
,因此需要指定引入 Objective-C runtime 的 Foundation framework,其他設定基本上與 C 語言無異。
# bash
clang \
# 指定要編譯的程式語言是 Objective-C
-lobjc \
# 指定引入 Objective-C runtime 的 Foundation
-framework Foundation \
main.m \
-o ./main
使用 Command line 都會知道 stdout 與 stderr 的概念。stdio 是在 Unix 的標準串流,其中包含了 stdin、stdout、stderr。
圖片來自 https://en.wikipedia.org/wiki/Standard_streams
Objective-C 中,打印分別有 printf 與 NSLog,各自對應的是 char*
與 NSString
,我們會在接下來的幾天詳細介紹 String。首先,我們可以建立一個檔案為 main.m
,並開始編寫程式!
// Objective-C
main() {
printf("Hello world\n");
}
或許學過 C 語言的讀者會發現,這不就是 C 語言的經典程式碼!
"Hello, World!" program by Brian Kernighan (1978)
是的沒錯,Objective-C 是 C 語言的 Superset(超集),Objective-C 甚至可以直接引入 C 語言的檔案 (不是 C++)。接下來,我們嘗試用 Objective-C 的打印指令 NSLog
。
// Objective-C
#import <Foundation/Foundation.h>
main() {
NSLog(@"Hello world");
}
由於 NSLog 是在 Foundation 的函式庫裡面,使用 #import
引入 Foundation/Foundation.h;NSLog 只支援 NSString,所以我們使用 @""
而 不是 ""
(沒有 @
符號)。
在 Swift 中,在字串內加入變數是很簡單的,我們只要使用 "\()"
就可以將任意變數加到字串裡面,但是在 C 與 Objective-C 則需要使用 format 的方式。
// Objective-C
NSString* name = @"ithelp";
NSLog(@"Hello %@", name);
補充:
C++ 可以透過副檔名 .mm
使用,並配上 clang -objC++
使用編譯指令
來源: Clang 12 documentation https://clang.llvm.org/docs/CommandGuide/clang.html
Hi,請問文中的編譯器使用方法段落中的 而產出的檔案則自動成為 execuable 的二進制執行檔 ( u+x )
,execuable 是否為 executable?
若有誤解,再煩請指證~
感謝,確實是筆誤,已經修正了 (^o^ )