我在MSVC2010中有一段C ++代码,它创建了一个DLL包装器。代码部分看起来像这样......
extern "C" __declspec(dllexport) DWORD myDllExportFunction()
{
return (DWORD)SomeFunction(SomeParameter);
}
...或
_declspec(dllexport) int64 _stdcall myDllExportFunction2(<someType> someParameter){
{
return new (DWORD)SomeExternalFunction(SomeParameter);
}
我希望我的导出部分在此dll上执行dumpbin只包含完全限定的函数名称,但它看起来更像是这样。
_myDllExportFunction@12 = _myDllExportFunction@12
我不知道为什么这个等号存在或意味着什么。我有一种强烈的感觉,导入dll的程序无法访问该函数,因为它没有按照预期进行操作。
为了提供足够的信息,我已经包含了一些编译器和链接器开关
编译器选项:
/Zi /nologo /Wall /WX- /O2 /Ob2 /Oi /Oy- /D "_WINDLL" /D "_MBCS" /D "_AFXDLL" /Gm- /EHsc /GS /fp:precise /Zc:wchar_t /Zc
链接器选项:
/MANIFESTUAC:"level='asInvoker' uiAccess='false'" /DEBUG /PDB:"C:\....\MyProj.pdb" /SUBSYSTEM:CONSOLE /OPT:REF /OPT:ICF /PGD:"C:\....\MyProj.pgd" /TLBID:1 /DYNAMICBASE:NO /NXCOMPAT:NO /IMPLIB:"MyProj.lib" /MACHINE:X86 /ERRORREPORT:QUEUE
注意:/ IMPLIB:“MyProj.lib” - &gt;这个导入库包含了我希望在我的DLL中拥有的所有导出,其格式是我希望它们在dll中。
我的项目选项中是否有任何设置会导致此问题?在过去的几年中,我可能错过了dllexport的任何变化吗?是否有任何可以帮助您了解我的问题的信息?
答案 0 :(得分:3)
尝试关闭调试信息生成。
答案 1 :(得分:0)
您通过声明__stdcall
来破坏名称,可能是在单独的声明中。你必须给它__cdecl
调用约定,以避免名称错位。
答案 2 :(得分:0)
如果要控制导出函数的名称(例如,删除修改),则需要使用链接器module definition (.def
) file。
答案 3 :(得分:0)
有一些不同的选项可以防止名称损坏。
更改导出函数的声明说明符
__stdcall
到__cdecl
。所以函数签名应该是这样的
此
extern "C" DWORD __declspec(dllexport) __cdecl myDllExportFunction()
如果必须使用__stdcall
调用约定,请使用以下两种方法之一来绕过名称修改。在这两种情况下,您都不需要将__declspec(dllexport)
添加到函数定义中(但如果这样做,则可以)。
LIBRARY YourLibraryName
EXPORTS
myDllExportFunction
/export:myDllExportFunction