天天看點

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(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。