一個正常的OS X.dylib幾乎可以滿足你的要求,注意你需要一個導出文件,鏈接器用它來確定導出哪些符號(以防止泄漏你的內部符號)。
爲了使您自己的庫依賴性安全,您可能需要將這些庫包含在您的庫中,或將它們靜態鏈接到庫中。
編輯:爲了回答如何應用exports文件的鏈接命令的後續問題,爲ld
手冊頁有以下說:
-exported_symbols_list filename
The specified filename contains a list of global symbol names
that will remain as global symbols in the output file. All
other global symbols will be treated as if they were marked
as __private_extern__ (aka visibility=hidden) and will not be
global in the output file. The symbol names listed in file-
name must be one per line. Leading and trailing white space
are not part of the symbol name. Lines starting with # are
ignored, as are lines with only white space. Some wildcards
(similar to shell file matching) are supported. The *
matches zero or more characters. The ? matches one charac-
ter. [abc] matches one character which must be an 'a', 'b',
or 'c'. [a-z] matches any single lower case letter from 'a'
to 'z'.
所以,如果您的圖書館只有兩個你想要公開的函數,我們稱它們爲foo
和bar
,它們是C函數(所以符號名不會被損壞),你的輸出文件(我們稱之爲myLibrary.exports
)將包含這兩行:
_foo
_bar
並且可能還有一些註釋等。當您執行構建庫的最後一個鏈接步驟時,您會將-exported_symbols_list myLibrary.exports
標誌傳遞給鏈接器。這還有另外的好處,即如果你不提供一個導出的符號,鏈接將會失敗;這可以捕捉到很多「哎呀,我忘了把這個文件包含在構建中」的錯誤。
當然,您不需要使用命令行工具來執行所有操作。在XCode動態庫的構建設置中,您會發現Exported Symbols File
(默認情況下未定義);將其設置爲您的導出文件的路徑,並將其傳遞給鏈接器。
這似乎是一個很好的解決方案。關於如何創建導出文件,您有沒有很好的參考? – Laserallan 2009-11-19 23:52:34
我添加了一些關於如何使用導出文件的細節;關於如何創建一個,如果庫不是太大,我通常使用nm來獲取所有符號的列表,然後刪除那些我想保持私有的。對於大型項目,這不是一個真正可行的方法,所以我通常編寫腳本來爲我生成文件。 – 2009-11-20 01:42:54
另請注意,不需要單獨的32位和64位庫; OS X允許支持多種體系結構的dylib。從命令行看起來有些複雜,但如果你使用XCode,它應該是Just Work。 – 2009-11-20 01:45:08