2016-04-27 64 views
0

我發現了一種有趣的方式,從dll(windows)使用模塊定義(.def)文件和友好名稱導出函數來導出函數,但是我找不到任何有關這怎麼可以在Mac上完成。.def文件等效於OS X

我想知道是否有模塊定義在OS X上任何等價

+0

您的意思是[like this question](http://stackoverflow.com/questions/4506121/how-to-print-a-list-of-symbols-exported-from-a-dynamic-library)? – tadman

回答

1

的你要找的東西(如果我的理解是)可以使用完成的主要部分-alias <symbol_name> <alternate_symbol_name>-alias_list <filename>選項鍊接器(ld)。您可以使用-exported_symbol <symbol>-unexported_symbol <symbol>及其文件列表對應文件-exported_symbols_list <filename>-unexported_symbols_list <file>實現附加控制。

1

使用.def文件在導出的符號上強制實現更簡單的命名約定是確實不是要走的路 - 通常一旦遇到該級別的問題,很可能會出現其他問題。我在此基礎上的C++標籤在你的問題。

通常編譯器/鏈接器將生成正確的mangling,以匹配您要導出的代碼,如果您打算連接C++代碼,以便在嘗試使用代碼時,鏈接器錯誤將表明您正在脫離二進制兼容性,並且連接可能是你的問題中最少的 - 你們都會陷入潛在的不兼容的分配器等等。

你應該導出一個簡單的「C」API,這將減少鏈接的複雜性 - 有一個明確的C鏈接,並且例程將獲得簡單的名稱進行鏈接。

這是後衛的.h文件中通用:

#ifdef __cplusplus 
extern "C" { 
#endif 

… library exports … 

#ifdef __cplusplus 
} 
#endif 

這將自動將讓你針對鏈接突出地簡單的名字比你通常會看到試圖對C++代碼的鏈接時,迴旋 - 只要你#include.h文件在編譯.cpp文件時,只要有你想要導出的例程.h中有相應的定義在.cpp中的聲明,它們將被自動導出demangled。

你仍然可以使用Ken Thomases提供的答案 - 他們會給你符號的可見性和符號別名,但是TBH,這聽起來像是你試圖將你一直用在windows中的解決方案放到另一個平臺上,但對我來說,似乎你一直在Windows平臺上使用不正確的方法。

歷史/聯動評論:

我還要提及的是Windows上的.def文件支持真正的不同而造成的出口機制上的窗口 - 從.dll文件它最初導出的符號按順序 - 即一個數字,因此您必須使用def文件重新映射名稱的鏈接以回到所涉及的數字,以便了解諸如調用約定之類的事情。大多數unix/linux系統從未只導出編號索引,這意味着在API中定義的名稱可以直接鏈接。
現在,從窗口.dll文件導出的函數名稱末尾稍微有些扭曲的@<number>項表示參數所需的字節數。__stdcall調用約定增加了這一點,以確保調用者明白被調用的函數將在返回之前從堆棧中彈出該字節數,以便調用者可以清除函數調用的任何可能的額外參數(這只是理論上 - variadic例程被編譯器自動轉換爲cdecl調用約定以默認消除此問題)。
其他平臺上的ABI不使用調用約定,它可以將調用者和被調用者之間的堆棧清理的責任分開,因此,不要像默認的'保護'那樣使用調用約定。

+0

謝謝你的詳細回答,我一定會需要重新考慮一些我的方法。 我將Ken Thomases的答案標記爲追蹤目的,因爲它直接回答問題,但您的答案非常有幫助,並讓我思考我所做的事情。 – user3081123