2011-01-19 22 views
0

我已經創建了一個使用xcode for IOS的​​靜態庫。在C++中,如果需要從其他程序中調用類,則需要添加「__declspec(dllexport)」來導出類。在xcode中,不需要導出。有沒有辦法阻止我想要暴露給其他程序的庫中函數的調用?防止在靜態庫中調用函數

謝謝。

回答

2

http://developer.apple.com/library/mac/#documentation/MacOSX/Conceptual/BPFrameworks/Tasks/ExportingInterfaces.html

導出你的框架接口

當你建立一個使用Xcode的框架或應用程序,鏈接器的出口都在你的代碼默認定義的符號。對於具有許多符號的運輸框架,這可能會導致運行時出現性能問題。加載框架時,動態鏈接編輯器將加載與框架相關聯的符號。如果一個框架包含許多私有函數,那些私有函數的符號將不會被使用,但仍然與公共函數的符號一起被加載。加載這些額外的符號不僅會浪費內存,還需要更多的工作才能在符號查找期間遍歷列表。

在Xcode中,您可以通過在鏈接器選項中指定導出文件來限制由可執行文件導出的符號。

創建您的exports文件

一個exports文件是包含要導出的符號列表一個簡單的文本文件(.txt或其他文本文件擴展名)。要創建該文件,請向您的Xcode項目添加一個新的空文件。在此文件中,添加要導出的符號列表,每行一個符號。

對於基於ANSI C的代碼,通常只需在函數或變量的名稱前加一個下劃線字符即可得到符號名稱。對於像C++這樣使用破壞符號名稱的語言,您可能需要運行nm工具來獲取現有符號名稱的列表。使用-g選項運行nm以查看當前導出的符號。然後,您可以複製該工具的輸出並將其粘貼到導出文件中,從而刪除任何無關信息。下面的文本顯示了通過納米產生的Cocoa框架一些樣本輸出:

U .objc_class_name_NSDate 
b000ad54 T _InitCocoaFW 
b000aea8 T _addNumbers 
b000ade8 T _getInitDate 
U _objc_msgSend 

要導出在此輸出中規定的框架功能,您可以創建帶有這個文本的文本文件:

_InitCocoaFW 
_addNumbers 
_getInitDate