當前位置:編程學習大全網 - 源碼下載 - 如何在mac osx中創建動態鏈接庫

如何在mac osx中創建動態鏈接庫

創建動態鏈接庫:

1、生成module文件,也就是.o文件。這跟壹般的Linux沒什麽區別。

cc -c a.c b.c 就得到a.o和b.o

2、用ld來合並.o文件

ld -r -o c.o a.o b.o 這個也沒什麽特別。

3、用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等工具,出錯的幾率應該小壹些。

訪問動態鏈接庫:

1、nm是最常用的,這個用法跟linux下差不多

nm c.dylib 可以看到導出符號表,等等。

2、另壹個常用的工具是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。

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

這裏介紹壹下怎麽開發最簡單的Cocoa程序,這個程序實在是太簡單,因為如果妳用Xcode的話,選用Cocoa Foundation Command Tool的話,應該不用寫任何代碼, 但是這裏是為了向大家介紹壹下,這個最簡單的程序是如何通過gcc編譯成功的,當然裏面還有壹個東西可以做壹點解釋.

先看看源代碼:

#import <Foundation/Foundation.h>

int main(int argc, char* argv[])

{

NSLog(@"Hello Cocoa From Console");

return 0;

}

代碼很簡單,妳可以用妳喜歡的任何文本編輯工具來完成它, 源碼文件名為hello.m, 這樣簡單的壹個程序用xcode的話就太奢侈了.

ok,下面來看看怎麽編譯這個程序, 打開終端, cd 到源文件所在的目錄,然後執行下面的這個命令,就可以生成壹個叫做hello的程序了.

gcc -framework Foundation hello.m -o hello

這裏面需要解釋的是 -framework 參數, 熟悉gcc的朋友可能知道,gcc中的-l參數其實是傳遞給ld命令的,是用於鏈接器工作的, mac下面的-framework和-l參數的效果是壹樣的,就是告訴ld編譯後的目標文件在生成最終的執行文件的時候,要連接哪個framework, 因為mac的核心Darwin也是壹個unix,所以在Mac下面-l參數也是被支持的.

另外還有壹點, gcc還可以接受-L來指定要連接的library在什麽位置,這個選項壹般用來連接第三方的庫, 那麽如果我想連接第三方的Framework的時候,我應該怎麽做呢? -L /your/Framework? 不對, gcc針對這種情況使用了另外壹個參數 -F, 所以如果妳要連接第三方的framework, 比如/opt/Qt4/QtCore, 妳應該像下面這樣使用gcc.

gcc -F/opt/Qt4 -framework QtCore qttest.cpp -o qttest

好了,現在繼續來解釋上面那個程序裏面的另壹個問題,為什麽字符串的前面多了個@符號呢?想必這個東西也困擾了不少人, 在obj-c裏面@"string"這種模式在編譯的時候會被編譯器進行壹個轉換,生成壹個NSString指針的實例,所以在需要NSString指針作為參數的地方,如果妳不想明確的構造這個NSString指針, 那麽用這種方法就最簡單了,但是如果妳將@"String"模式用在了需要c string的地方,就要出現錯誤了。

Note:

因為obj-c都是用指針操作的,用"字符串"這樣表示的c string,明顯compiler是不知道這個"字符串"的地址應該放在在哪裏。前面加個at,那麽@"字符串"的意思基本上是new壹個叫做"字符串"的NSString,並且返回這個NSString的地址。

所以

NSLog("Hello Cocoa From Console");

這樣就會出錯,

NSLog(@"Hello Cocoa From Console");

這樣就沒問題。

  • 上一篇:結婚當天鋪床有什麽講究?
  • 下一篇:求壹個Java小程序可運行,包含兩種以上的設計模式,隨便什麽設計模式都行
  • copyright 2024編程學習大全網