如何從Apple提供的源代碼編譯objc runtime?
經常看見某些大牛關於objc runtime的文章,感覺很厲害,所以也想玩一下objc runtime。
我們可以從 Source Browser 下載objc4源代碼。我用xcode嘗試編譯了一下,報錯,缺少各種頭文件,我Google了這些頭文件,並把它們放到/tmp/objc.dst/usr/include中,還是報錯,比如語法錯誤等。實在不知道如何是好,請問各位研究過runtime的大牛:1. 如何從Apple提供的源代碼編譯objc runtime?
2. 編譯完成以後,應該會得到一個libobjc.A.dylib,如何使用這個dylib(代替系統的libobjc.A.dylib)?如果你也想研究runtime,是否有興趣自己編譯一下,並且把你的經驗分享一下呢?如果你也想知道答案,是否可以幫忙點擊一下下面的「邀請回答」,請大牛來解惑呢?這個問題我在stackoverflow上也有提問,鏈接:ios - how to compile and use objc runtime from apple"s source code?----------------update 2015-04-02-------------既然各位大神都來了,就再補充提問一下(題主小菜,大神不要笑話啊):1. libobjc.A.dylib到底有什麼用?和Objective-C這門語言到底有什麼關係?
2. Apple提供的objc4源代碼根目錄下有objc.sln,是否說明Apple把objc編譯到了windows平台?我們是否也可以用objc開發windows應用呢?比如下面的代碼 test.m :
#import &
int main(int argc,const char *argv[]){
NSLog(@"hello %@",@"world");
}
運行:
gcc -ObjC -framework Foundation test.m otool -L a.out
輸出:
/System/Library/Frameworks/Foundation.framework/Versions/C/Foundation (compatibility version 300.0.0, current version 1152.14.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1213.0.0)
/System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation (compatibility version 150.0.0, current version 1152.0.0)
這個時候,沒有libobjc.A.dylib
但是,如果我們修改一下test.m:
#import &
int main(int argc,const char *argv[]){
NSLog(@"hello %@",[NSString stringWithFormat:@"world"]);
}
再運行:
gcc -ObjC -framework Foundation test.m otool -L a.out
這時候輸出:
/System/Library/Frameworks/Foundation.framework/Versions/C/Foundation (compatibility version 300.0.0, current version 1152.14.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1213.0.0)
/System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation (compatibility version 150.0.0, current version 1152.0.0)
/usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 228.0.0)
/usr/lib/libobjc.A.dylib為什麼被引用了?
我在xp虛擬機上安裝了iTunes,打開目錄:C:Program FilesCommon FilesAppleApple Application Support我們看到objc對應的framework,在這裡都成了dll,包括objc.dll。這些東西有什麼用,iTunes會不會是用objc寫的呢?問題比較多,但是都是關於objc runtime的。表達能力不好,您能看完問題,我已經很開心了。如果您能對其中任何一個問題給我提供任何線索,我都將非常感激!!!另外,我會把我學到的一切關於runtime的知識都分享到我自己的博客上,大家可以在這裡查閱:從源代碼編譯objc runtime
坑佔了確實略久(最近太忙, 只看不發)...... 不過評論里的一位同學說是一個長篇回答肯定不至於, 只是做了補漏工作, 把所有缺失的私有文件全部按照對應要求放到include下, 改改工程設置就算大功告成了, 由於我只在OSX下編譯過, 又不接觸微軟系列所以沒法幫題主具體在瘟都死下編譯了, 如果題主不介意可以去我github上下 已經傳上去了, 可以自行比對, 請猛戳 RetVal/objc4-532.2 · GitHub.
順便回答小問題:
1. 是語言的運行時, 沒有這個objc代碼編譯完基本不可能跑不起來.
2. 是可以的, 不然瘟都死下的iTunes里的那堆東西是什麼, 基本可以認為是原封不動的帶著依賴過來的. 是不是能讓我們來開發呢, 也是可以的, 不過對於蘋果外圍的第三方開發人員來說, 非常麻煩, 因為缺失各種文件和編程環境, 開發前期預備工作比你項目本身還多, 得不償失.
3. @"" 這個會創建一個NSString(這是廢話, 但又不是), 嚴格意義上是__NSConstantString, 由編譯器和runtime一個約定的結構體, 用來描述字元串常量對象, 我扯了這麼多就是為了說明由@""定義的NSString是靜態的, 編譯期完全決定完畢, 所以第一個版本的test.m和printf("xxxx");沒有什麼區別.
而後面的test.m產生了消息發送(一般是用函數調用, 方法調用來說, 不過本人不是很喜歡這種掩蓋objc特性的說法), 消息發送必然會走runtime做派發, 所以看1就懂了.4.最後一問在2里就基本說明了.
先發圖占坑...沒玩過,以前是看GNU的那套源碼。關注一下,看看有沒有朋友成功。
替換的話應該可以用 LD_PRELOAD
搜索 怎樣把obj編譯到安卓 有個視頻,講了幾個開源項目
推薦閱讀:
※Xcode工程設置裡面編譯器選項為啥沒有GCC?
※clang分析源碼前判斷是按C模式還是按C++模式分析的過程?
※如果有一天,所有的 編譯器都消失了,人類應該如何最快恢復?
※編譯後的c/c++ 程序, 如何判斷一個函數 是否 真的inline了(如果不看反彙編話)?
TAG:iOS | iOS開發 | Xcode | Objective-C | 編譯器 |