C++ 如何将带有未修饰导出的uu stdcall dll链接到uu cdecl二进制文件中?

C++ 如何将带有未修饰导出的uu stdcall dll链接到uu cdecl二进制文件中?,c++,qt,dll,linker,C++,Qt,Dll,Linker,我的32位windows程序使用默认的cdecl调用约定。它正在使用Qt工具包。我试图使用未更改的dll,它使用的是u stdcall约定,只导出未修饰的名称 dumpbin /exports library.dll [...] 00000000 characteristics 0 time date stamp 0.00 version 1 ordinal base 210 number of functio

我的32位windows程序使用默认的cdecl调用约定。它正在使用Qt工具包。我试图使用未更改的dll,它使用的是u stdcall约定,只导出未修饰的名称

dumpbin /exports library.dll
[...]
    00000000 characteristics
           0 time date stamp
        0.00 version
           1 ordinal base
         210 number of functions
         210 number of names

    ordinal hint RVA      name
[...]
          6   9D 0000361C OpenComm
[...]
我创建了带有修饰名称映射的.def文件:

EXPORTS
    _OpenComm@8=OpenComm
因此.lib有以下导出(注意前面的双下划线):

头文件包含(请注意,为了匹配.lib,我必须在其中添加下划线):

程序编译良好,但当我尝试运行它时,运行时链接器给我一个错误:

The procedure entry point _OpenComm@8 could not be located in the dynamic link library.

嗯。Dll没有我的映射名称。。。我怎样才能解决这个问题?我可以在编译的.dll中重命名导出吗?:-)

问题不在于DLL,而在于生成.lib的方式以及如何编写头文件

不要在头文件中为函数添加下划线。编译器/链接器工具链将自动处理符号中的下划线

试一试

现在,如果在构建DLL和.lib时正在使用.def文件,则该文件应该如下所示:

LIBRARY mylibrary
EXPORTS
    OpenComm
但是,由于只从.def文件生成.lib,并且dll使用stdcall,因此需要更改.def:

LIBRARY mylibrary
EXPORTS
    OpenComm@8 @6

这将有效地生成导出
_OpenComm@8
并将使exe调用dll中序号为
6
的符号。请注意,如果更新DLL,则必须使用
dumpbin
检查是否有任何序号发生了更改,并相应地更新.def。

问题不在于DLL,而在于生成.lib的方式以及如何编写头文件

不要在头文件中为函数添加下划线。编译器/链接器工具链将自动处理符号中的下划线

试一试

现在,如果在构建DLL和.lib时正在使用.def文件,则该文件应该如下所示:

LIBRARY mylibrary
EXPORTS
    OpenComm
但是,由于只从.def文件生成.lib,并且dll使用stdcall,因此需要更改.def:

LIBRARY mylibrary
EXPORTS
    OpenComm@8 @6

这将有效地生成导出
_OpenComm@8
并将使exe调用dll中序号为
6
的符号。请注意,如果更新DLL,则必须使用
dumpbin
检查是否有任何序号发生了更改,并相应地更新.def。

当我按照您的建议进行编译时,我遇到了链接问题:错误:LNK2019:未解析的外部符号_OpenComm@8在函数中引用。。。我的环境是Qt 5.8和Visual Studio 2015Try
\uuu declspec(dllimport)int\uu stdcall OpenComm(char*com,int波特率)它没有帮助:nexus.obj:-1:错误:LNK2019:未解析的外部符号\uuu imp__OpenComm@8在函数中引用…@MariuszZieliński我已更新了我的答案,以考虑def文件中的_ustdcall。我建议你看一看,这是一本关于这类话题的好书。我没有记下你的答案。我不喜欢人们不留下评论就这么做。我不能修改我的.dll文件。它包含未修饰的导出,实际上是stdcall调用。问题是说服我的程序使用未修饰的符号而不是_name@number. 我可以通过使用QLibrary手动加载库来实现这一点,但它似乎不那么优雅。当我听从您的建议时,我在编译过程中遇到了链接问题:错误:LNK2019:未解析的外部符号_OpenComm@8在函数中引用。。。我的环境是Qt 5.8和Visual Studio 2015Try
\uuu declspec(dllimport)int\uu stdcall OpenComm(char*com,int波特率)它没有帮助:nexus.obj:-1:错误:LNK2019:未解析的外部符号\uuu imp__OpenComm@8在函数中引用…@MariuszZieliński我已更新了我的答案,以考虑def文件中的_ustdcall。我建议你看一看,这是一本关于这类话题的好书。我没有记下你的答案。我不喜欢人们不留下评论就这么做。我不能修改我的.dll文件。它包含未修饰的导出,实际上是stdcall调用。问题是说服我的程序使用未修饰的符号而不是_name@number. 我可以通过使用QLibrary手动加载库来实现这一点,但它似乎不那么优雅。
LIBRARY mylibrary
EXPORTS
    OpenComm@8 @6