我試圖建立一個項目,我有它有幾個導出的功能。該功能遵循STDCALL約定,如果使用GCC編譯爲GCC中有沒有什麼可以改變出口名稱的方案?
[email protected]
其他編譯他們得到錯位裂傷的名字是這樣的:
[email protected]
任何方式我可以強制GCC到裂傷的名字導出函數到後面的例子?
我試圖建立一個項目,我有它有幾個導出的功能。該功能遵循STDCALL約定,如果使用GCC編譯爲GCC中有沒有什麼可以改變出口名稱的方案?
[email protected]
其他編譯他們得到錯位裂傷的名字是這樣的:
[email protected]
任何方式我可以強制GCC到裂傷的名字導出函數到後面的例子?
有關-fleading-underscore,請參閱GCC手冊。不過,請閱讀關於此行動後果的警告;它可能不是你認爲它的解決方案。
在Windows上處理函數名稱損壞時最好的辦法是始終使用.def
文件。無論編譯器如何,這都是一樣的。通常,您只需要EXPORTS
部分:
EXPORTS
Func1
Func2
...
請參閱this answer。
int Func() __asm__("[email protected]");
這將迫使GCC命名符號[email protected]
不管是什麼它會正常完成。
哦對,@
是特殊的:它用於符號版本控制。我認爲__asm__("[email protected]")
曾經工作,但我想它現在不行了。
int Func() __asm__("_Func");
__asm__(".symver _Func, [email protected]");
這必須由version script文件陪同,如:
1 {
global:
_Func;
};
鏈接時給予
gcc -Wl,--version-script=foo.version
。
謝謝,但無論我做錯了什麼或它不起作用,它都不會讓我聯繫它。 http://pastebin.com/f14a9a00f – 2009-11-10 07:40:31
感謝您的答案,雖然它似乎沒有工作,所以在C標準是不使用領先的下劃線?我試圖讓它在編譯器中可移植,這些函數是需要加載的DLL的導出。 – 2009-11-09 21:11:45
您是否將代碼編譯爲C或C++?爲了編譯器的互操作性,DLL必須只提供C接口。你可以使用C++,但是接口應該聲明爲extern「C」(當然,只使用C compatable類型,並且沒有函數重載)。 – Clifford 2009-11-10 11:30:00