2013-01-09 81 views
0

由於特定的需求,我需要創造出一個出口是在一個特定的方式命名的函數的DLL,它也是錯位。C/C++碾壓出口以特定的方式

[email protected]@[email protected]@Z 

有沒有辦法實現這個?

+1

爲它指定具有相同數量字符的任何名稱,使用低級文件編輯器修改最終DLL可執行文件中的名稱。我建議'XdrawGdiXstopX234XXZ'。然後,改變X's。 –

+0

啊,聰明,我會試試:) –

+3

要小心 - C++ ABI並不總是彼此認同,符號名稱只是他們不同意的一種方式。 – Yakk

回答

1

你不能聲明你的函數,如:

class myclass; 
extern "C" void my_function(int,myclass&); 

那麼就應該導出爲my_function(至少在POSIX系統,我想這是在Windows上是相同的,但我不知道)。

如果用gcc編譯,你可以使用Asm Labels。然後彙編程序可以接受的任何名稱都可以。

的Linux上ELF可執行文件,你可能不能,因爲大衛·施瓦茨建議,只需編輯二進制文件(因爲這可能會打破ELF用於某些符號哈希表)。

+1

是的,這也應該在Windows上工作。 – TheMathemagician

+0

它需要完全是我寫的名字,它似乎不允許'@'和'?'在名稱 –

+0

@EricLindgren:Windows不允許在文件名中使用「?」。這不是C/C++的問題,而是Windows。 – Skalli

2

你可以這樣做,但你必須寫一個DEF文件。

foo.h中:

extern "C" declspec(dllexport) void foo(int); 

foo.def:

EXPORTS 
    [email protected]@[email protected]@Z=_foo 

_foo是函數導出的名稱)。

當然,請記住在鏈接DLL時指定DEF文件。

欲瞭解更多詳情,請參閱該documentation on DEF files

+0

正如你給的網址提到的......「有三導出的定義,在使用中的推薦的順序列出方法: 在源代碼中的 __declspec(dllexport)關鍵字一個輸出語句在.DEF文件 的/導出規格在LINK命令」。 DEF文件只是其中一種可用的方法!另外,還有第二選擇! – mox

+0

@mox:是的,但那只是簡單地輸出一個符號。根據該文件,DEF文件是唯一一個允許您指定'externalname'與'externalname'不同的文件。 – rodrigo

+0

我正在使用Visual Studio 2012,嘗試使用'extern「C」declspec(dllexport)void foo(int)編譯;'但它不想工作,所以我將其更改爲'extern「C」void foo (int);'和我的。def文件看起來像'EXPORTS ?drawGdi @ stop @ 234 @@ Z = foo',但是導出變成了'?drawGdi',其餘的都沒有了。 –