尴尬的DLL导出部分

时间:2011-09-30 17:25:12

标签: c++ visual-c++ dll dllexport dumpbin

我在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的任何变化吗?是否有任何可以帮助您了解我的问题的信息?

4 个答案:

答案 0 :(得分:3)

尝试关闭调试信息生成。

enter image description here

答案 1 :(得分:0)

您通过声明__stdcall来破坏名称,可能是在单独的声明中。你必须给它__cdecl调用约定,以避免名称错位。

答案 2 :(得分:0)

如果要控制导出函数的名称(例如,删除修改),则需要使用链接器module definition (.def) file

答案 3 :(得分:0)

有一些不同的选项可以防止名称损坏。

  • 更改导出函数的声明说明符 __stdcall__cdecl。所以函数签名应该是这样的 此

    extern "C" DWORD __declspec(dllexport) __cdecl myDllExportFunction()

如果必须使用__stdcall调用约定,请使用以下两种方法之一来绕过名称修改。在这两种情况下,您都不需要将__declspec(dllexport)添加到函数定义中(但如果这样做,则可以)。

  • 将.def文件添加到包含行
  • 的项目中
  

LIBRARY YourLibraryName
      EXPORTS
      myDllExportFunction

  • 在项目属性中,转到链接器 - &gt;命令行并在其他选项的编辑框中添加/export:myDllExportFunction