2008-09-20 105 views
8

當我們在visual studio 2008中使用__stdcall編譯dll時,dll中的編譯函數名是。GCC使用__stdcall編譯dll

FunctionName

雖然當我們使用GCC使用WX-DEV-CPP GCC追加paramers函數具有數量編譯相同的dll,所以使用的Dependency Walker的函數的名字看起來像。

FunctionName @ numberOfParameters或== FunctionName @ 8

如何告訴GCC編譯器,以從DLL導出符號刪除@nn?

回答

5

__stdcall通過向起始處添加下劃線和末尾參數的字節數(由@分隔)來裝飾函數名稱。

所以,一個功能:

void __stdcall Foo(int a, int b); 

...將成爲_Foo @ 8。

如果您在.DEF文件的EXPORTS部分列出函數名稱(未修飾),則將其導出爲undecorated。

也許這是區別?

+0

感謝羅傑的答覆,事實證明,問題是另一名開發人員將DEF文件放入該項目中。這個DEF文件告訴鏈接器在DLL中使用的命名約定。這就是爲什麼我們即使使用相同的調用約定也能得到不同的庫名稱的原因。 解決方案證明我們的開發人員在爲項目創建自己的DLL時已經從頭文件中刪除了WINAPI。這導致windows visual studio恢復爲默認調用約定__cdecl(/ Gd)。 – Chad 2009-12-08 02:56:41

0

您還可以使用-Wl,--add-stdcall-alias到鏈接器選項GCC。這將確保函數名稱(裝飾的和未裝飾的)都存在並可以用作別名。

+0

感謝馬提亞斯不知道這一點。 – Chad 2014-06-11 04:20:22