動态連結庫已成為現代作業系統的基本組成部分,比如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(http://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。