2

我在 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" -> 这个导入库包含我希望在我的 DLL 中具有的所有导出,其格式是我希望它们在 dll 中的格式。

我的项目选项中是否有任何设置会导致这种情况?在过去几年中,dllexport 是否有任何我可能错过的变化?有什么我可以提供给你的信息来帮助你理解我的问题吗?

4

4 回答 4

2

尝试关闭调试信息生成。

在此处输入图像描述

于 2011-09-30T17:34:42.030 回答
0

您通过声明它破坏了名称__stdcall,大概是在单独的声明中。您必须为其提供__cdecl调用约定以避免名称混淆。

于 2011-09-30T17:37:47.427 回答
0

如果您想控制导出函数的名称(例如,删除重整),您需要使用链接器模块定义 ( .def) 文件

于 2011-09-30T17:44:27.563 回答
0

有几个不同的选项可以防止名称篡改。

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

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

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

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

图书馆 YourLibraryName     导出
myDllExportFunction

  • 在项目属性中,转到Linker -> Command Line并在Additional Options的编辑框中添加/export:myDllExportFunction
于 2011-09-30T18:09:31.070 回答