閱讀607 返回首頁    go 阿裏雲 go 技術社區[雲棲]


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

  上一篇:go gnome桌麵終端程序 Guake
  下一篇:go jquery動態表格,動態添加表格行