C DLL 匯出:修飾與未修飾的名稱
從C DLL 匯出函數時,您可能會遇到修飾(損壞)的名稱。此行為是由編譯器用於解析 C 中符號名稱的名稱修飾機制所引起的。
模組定義檔 (.def)
使用模組定義檔時,您明確指定匯出函數的名稱。但是,編譯器仍然會為導出的符號名稱添加修飾後綴。這是函數名稱的變形版本,其中包括有關函數參數、傳回類型和其他詳細資訊的資訊。
extern "C" Export
匯出函式使用「extern「C」」語法可防止編譯器對函式名稱進行名稱修改。但是,它不會刪除“=”之後的附加後綴。
Pragma Comment
明確匯出函數的另一種方法是使用 #pragma comment 連結器指示。該指令允許您指定要匯出的修飾函數名稱。例如:
#pragma comment(linker, "/EXPORT:SomeFunction=_SomeFunction@@@23mangledstuff#@@@@")
此指令指示連結器使用提供的修飾名稱匯出「SomeFunction」函數。
FUNCTION 巨集
另一個選擇是使用函數體內的 FUNCTION 巨集。此巨集擴展為未修飾的函數名稱。然後,您可以使用 pragma comment 指令匯出具有修飾名稱的函數,如下所示:
#pragma comment(linker, "/EXPORT:" __FUNCTION__ "=" __FUNCDNAME__)
此技術可讓您指定修飾名稱而無需明確指定它。
透過採用這些方法中的任何一種,您都可以控制匯出的函數名稱,並避免使用.def 檔案或「extern “C””時可能出現的不需要的“=”和修飾後綴。文法.
以上是如何控制 C DLL 中的導出函數名稱:修飾與未修飾?的詳細內容。更多資訊請關注PHP中文網其他相關文章!