2008-09-20 106 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