Mac OS X下的動態鏈接庫
動態鏈接庫已成為現代操作係統的基本組成部分,比如Windows下數不清的.DLL文件和臭名昭著的DLL地獄,Linux下成千上萬的.so文件。Mac OS X下也有許多動態鏈接庫,
他們的擴展名是.dylib。
.dylib是Mach-O格式,也就是Mac OS X下的二進製文件格式。Mac OS X提供了一係列
工具,用於創建和訪問動態鏈接庫。
編譯器/usr/bin/cc,也就是gcc了,Apple改過的。這個主要還是一個殼,去調用其他
的一些部件。當然同時還有/usr/bin/c++,等等。
匯編器/usr/bin/as
鏈接器/usr/bin/ld
Mac OS X有個自己的工具,/usr/bin/libtool,來創建動態鏈接庫。這個libtool不是
GNU的那個同名的libtool。我記得GNU libtool可以從Fink(https://fink.sf.net)下
載,編譯後得到glibtool。
下麵來看看如何創建動態鏈接庫。
首先是生成module文件,也就是.o文件。這跟一般的unix沒什麼區別。例如
cc -c a.c b.c
就得到a.o和b.o
可以用ld來合並.o文件,比如
ld -r -o c.o a.o b.o
這個也沒什麼特別。
然後可以用libtool來創建動態鏈接庫。
libtool -dynamic -o c.dylib a.o b.o
( 這裏也可以用libtool -static -o c.a a.o b.o就創建靜態庫)
如果用gcc直接編譯,我記得linux下一般是可以
gcc -shared -o c.so a.c b.c
而在Mac OS X下需要
gcc -dynamiclib -o c.dylib a.c b.c
這往往也是向Mac OS X移植unix程序常出問題的地方。如果用autoconf/automake等
工具,出錯的幾率應該小一些。
接著來看看訪問動態鏈接庫的工具。
nm是最常用的,這個用法跟linux下差不多
nm c.dylib
可以看到導出符號表,等等。
另一個常用的工具是otool,這個是Mac OS X獨有的。比如想看看c.dylib的依賴關係
otool -L c.dylib
最後說一下我對Framework的理解。Framework是Mac OS X下必不可少的部分,不妨去
看看/System/Library/Frameworks/下麵,一大堆Framework。Framework是dylib的進
一步演化,它把頭文件、文檔、動態鏈接庫等整合成一個有機的目錄,類似一種自描
述的方式,這種做法其實在Mac OS X下隨處可見。比如應用程序,一般都是一個目錄,
譬如/Applications/iTunes.app目錄對應應用程序iTunes,雙擊這個目錄即開始執行。
這種做法和Windows下常見的一個exe/dll打天下很不相同。
Framework的創建工具也是libtool,詳細用法參考man。
最後更新:2017-04-03 18:51:50