由於特定的需求,我需要創造出一個出口是在一個特定的方式命名的函數的DLL,它也是錯位。C/C++碾壓出口以特定的方式
[email protected]@[email protected]@Z
有沒有辦法實現這個?
由於特定的需求,我需要創造出一個出口是在一個特定的方式命名的函數的DLL,它也是錯位。C/C++碾壓出口以特定的方式
[email protected]@[email protected]@Z
有沒有辦法實現這個?
你不能聲明你的函數,如:
class myclass;
extern "C" void my_function(int,myclass&);
那麼就應該導出爲my_function
(至少在POSIX系統,我想這是在Windows上是相同的,但我不知道)。
如果用gcc編譯,你可以使用Asm Labels。然後彙編程序可以接受的任何名稱都可以。
的Linux上ELF可執行文件,你可能不能,因爲大衛·施瓦茨建議,只需編輯二進制文件(因爲這可能會打破ELF用於某些符號哈希表)。
是的,這也應該在Windows上工作。 – TheMathemagician
它需要完全是我寫的名字,它似乎不允許'@'和'?'在名稱 –
@EricLindgren:Windows不允許在文件名中使用「?」。這不是C/C++的問題,而是Windows。 – Skalli
你可以這樣做,但你必須寫一個DEF文件。
extern "C" declspec(dllexport) void foo(int);
EXPORTS
[email protected]@[email protected]@Z=_foo
(_foo
是函數導出的名稱)。
當然,請記住在鏈接DLL時指定DEF文件。
欲瞭解更多詳情,請參閱該documentation on DEF files。
正如你給的網址提到的......「有三導出的定義,在使用中的推薦的順序列出方法: 在源代碼中的 __declspec(dllexport)關鍵字一個輸出語句在.DEF文件 的/導出規格在LINK命令」。 DEF文件只是其中一種可用的方法!另外,還有第二選擇! – mox
@mox:是的,但那只是簡單地輸出一個符號。根據該文件,DEF文件是唯一一個允許您指定'externalname'與'externalname'不同的文件。 – rodrigo
我正在使用Visual Studio 2012,嘗試使用'extern「C」declspec(dllexport)void foo(int)編譯;'但它不想工作,所以我將其更改爲'extern「C」void foo (int);'和我的。def文件看起來像'EXPORTS ?drawGdi @ stop @ 234 @@ Z = foo',但是導出變成了'?drawGdi',其餘的都沒有了。 –
爲它指定具有相同數量字符的任何名稱,使用低級文件編輯器修改最終DLL可執行文件中的名稱。我建議'XdrawGdiXstopX234XXZ'。然後,改變X's。 –
啊,聰明,我會試試:) –
要小心 - C++ ABI並不總是彼此認同,符號名稱只是他們不同意的一種方式。 – Yakk