链接到不带 .lib 的 .dll 文件

2024-01-09

我需要将一些Delphi代码重写为C++,并且我们需要链接到动态库TMLComm2004.dll。事实证明我们没有.lib文件,因此我们决定使用以下命令行生成它:

dumpbin /EXPORTS C:\Users\fayard\Desktop\TMLComm2004.dll > C:\Users\fayard\Desktop\TMLComm2004.txt

我们得到如下文件

Microsoft (R) COFF/PE Dumper Version 14.00.24215.1
Copyright (C) Microsoft Corporation.  All rights reserved.


Dump of file C:\Users\fayard\Desktop\TMLComm2004.dll

File Type: DLL

  Section contains the following exports for TMLcomm.dll

    00000000 characteristics
    401F6AD5 time date stamp Tue Feb  3 10:33:09 2004
        0.00 version
          1 ordinal base
          27 number of functions
          27 number of names

    ordinal hint RVA      name

          1    0 00001122 _MSK_COFFDownloadFlash@16
          2    1 0000114F _MSK_COFFDownloadRAM@20
          3    2 0000106E _MSK_CheckSum@12
          4    3 00001172 _MSK_CloseComm@0
          5    4 00001190 _MSK_GetActiveBoard@4
          6    5 0000109B _MSK_GetBoardInfo@8
          7    6 0000104B _MSK_GetBytesCountInQueue@0
          8    7 0000119A _MSK_GetChar@4
          9    8 000010E6 _MSK_GetCharNoWait@4
         10    9 000011A4 _MSK_GetCommBaudRate@4
         11    A 000010DC _MSK_GetHostBoard@4
         12    B 0000108C _MSK_OpenComm@16
         13    C 000011DB _MSK_ReceiveData@16
         14    D 000011CC _MSK_ReceiveMessage@4
         15    E 0000105A _MSK_RegisterReceiveUnsolicitedMsgHandler@4
         16    F 000011AE _MSK_ResetMSKBoard@0
         17   10 00001037 _MSK_SendChar@4
         18   11 000010EB _MSK_SendData@16
         19   12 0000126C _MSK_SendMessage@4
         20   13 0000128F _MSK_SetActiveBoard@4
         21   14 00001136 _MSK_SetB0BlockAsData@4
         22   15 0000100A _MSK_SetBoardBaudRate@4
         23   16 00001019 _MSK_SetCharMode@4
         24   17 00001168 _MSK_SetCommBaudRate@4
         25   18 00001050 _MSK_SetDebugWindow@8
         26   19 00001276 _MSK_SetHostBoard@4
         27   1A 00001046 _MSK_UpdateCommTimeouts@0

  Summary

        C000 .data
        3000 .idata
        6000 .rdata
        4000 .reloc
       21000 .rsrc
       3E000 .text
        2000 shdata

然后,我们编辑了TMLComm2014.txt文件并将其更改为.def删除了 @xx 的文件。该文件如下所示:

EXPORTS
_MSK_COFFDownloadFlash
...

然后,我们生成一个.lib文件:

lib /def:C:\Users\fayard\Desktop\TMLComm2004.def /out:C:\Users\fayard\Desktop\TMLComm2004.lib

我们编译如下程序:

extern "C" {
  bool MSK_OpenComm(unsigned char a, unsigned short b, bool c, unsigned char d);
}

...

当我们编译并链接时.lib,我们得到一个错误:

LNK2019 unresolved external symbol _MSK_OpenComm referenced in function...

我的做法有什么问题吗?

Update

我已经成功编译:

extern "C" {
  bool __stdcall MSK_OpenComm(unsigned char a, unsigned short b, bool c, unsigned char d);
}

但现在问题出在链接时。我很困惑,因为从命令行,我有:

==================================================
dumpbin /headers TMLComm.lib

  Version      : 0
  Machine      : 14C (x86)
  TimeDateStamp: 5964C365 Tue Jul 11 14:24:05 2017
  SizeOfData   : 00000022
  DLL name     : TMLComm2004.dll
  Symbol name  : __MSK_OpenComm@16
  Type         : code
  Name type    : no prefix
  Hint         : 11
  Name         : _MSK_OpenComm@16

==================================================
dumpbin /exports TMLComm.dll

         12    B 0000108C _MSK_OpenComm@16

==================================================

现在编译一切正常,但问题出在链接时:

link tmlcomm.obj Motor.obj main.obj TMLComm.lib /out:main.exe


Microsoft (R) Incremental Linker Version 14.00.24215.1
Copyright (C) Microsoft Corporation.  All rights reserved.

tmlcomm.obj : error LNK2019: unresolved external symbol _MSK_OpenComm@16 referenced in function "bool __cdecl msk_opencomm(unsigned char,unsigned short,bool,unsigned char)" (?msk_opencomm@@YA_NEG_NE@Z)
Teclis.exe : fatal error LNK1120: 1 unresolved externals

看看微软的修饰名称的文档 https://msdn.microsoft.com/en-us/library/56h2zst2.aspx#FormatC。对于 C,前导下划线和尾随@<number>表示stdcall调用约定,与标准不同cdecl.

因此,您应该修改符号结尾的所有函数的声明@<number>:

extern "C" {
  __stdcall bool MSK_OpenComm(unsigned char a, unsigned short b, bool c, unsigned char d);
}

我不确定是否要剥离@<number>部分来自.deffile 是正确的做法,我对此表示怀疑,但请尝试一下。

从我的实验来看MinGWs 工具用于创建.def file (gendef), 中的名称.def should not包括前导下划线,但它should包括@<number>部分在最后。因此对于这个示例函数,.def应该有以下行:

MSK_OpenComm@16

手动创建这些所需文件的替代方法是使用附带的工具MinGW。您可以执行以下操作:

gendef foobar.dll                     # generates the .def
dlltool -d foobar.def -l foobar.lib   # generates the import library

根据您的评论,您might需要手动编辑.def file gendef给你包含这样的行:

MSK_OpenComm@16=_MSK_OpenComm@16

看起来gendef可能会混淆,因为 dll 导出装饰名称这不是预期的。


当使用导入库,这将具有“静态存根”,其名称类似于 DLL 的实际导出符号,但带有__imp__前置。为了解决这个问题,您的声明中还需要另一个属性:

extern "C" {
  __declspec(dllimport) __stdcall bool MSK_OpenComm(unsigned char a, unsigned short b, bool c, unsigned char d);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

链接到不带 .lib 的 .dll 文件 的相关文章

随机推荐

  • 如何复制带有指向内部数据的指针的结构(以便复制它们指向的指针和数据)?

    所以我有一个像这样的结构 struct GetResultStructure int length char ptr 我需要一种方法来制作它的完整副本 这意味着我需要一个副本来拥有一个结构 其中新的 ptr 指向我在原始结构中拥有的数据副本
  • 自定义 datagridview 的结果

    当我的客户 BindingSource 从 datagridview 搜索客户时 当找不到匹配项时 我需要一个显示 未找到结果 的消息框 而不仅仅是 什么也不显示 尝试这个 Dim emptyRowCount As Integer IIf
  • 使用调色板功能时使 NA 透明

    这是我的数据框 Test structure list Corr p c 0 65 0 64 0 64 NA 0 79 0 77 Case p c 24 57 12 89 20 92 NA 11 1 12 2 Control p c 16
  • 为绘图应用程序添加撤消功能

    我关注了一个raywenderlich 教程 http www raywenderlich com 87899 make simple drawing app uikit swift关于使用 UIKit 制作绘图应用程序 我现在正在尝试添加
  • 居中位图标记(Google 地图 Android API v2)

    当我从自定义位图中添加标记时 标记未以我指定的点为中心 我这样添加 ID tramo final int tramoId tr getId Nodos final Nodo nodos tr getNodos final PolylineO
  • 如何使用 php 解析 .plist 文件?

    我可以用 php 解析 plist 文件并将其放入数组中吗 POST 这样我就可以打电话 POST body 并获取具有以下内容的字符串
  • 如何在 Emacs 中突出显示选项卡

    我在源代码中使用空格进行缩进 如何突出显示 标记代码中的选项卡 可能是红色的 和我用的时候一样 setq default show trailing whitespace t 作为 abo abo 的提示 我发现我可以在以下代码中使用空白模
  • HttpClient 存储在哪个程序集中

    我想使用HttpClient来自 WCF Rest Service 的类 用于创建调用 Rest 的客户端 服务 我听说它已被纳入 net 4 0 但不知道它存储在哪个程序集中 根据这个 MSDN 页面 http msdn microsof
  • ViewModel 中的 ASP.NET MVC SelectList

    我正在使用 ASP NET MVC 5 但这很可能也适用于以前的版本 提出这个问题的最佳方法是向您展示代码 这是视图模型 public class PersonCreateViewModel public SelectList cities
  • 有没有办法将 UNC 路径映射到 Windows 2003 上的本地文件夹?

    我知道我可以将 UNC 路径映射到本地驱动器号 但是 我想知道是否有办法将 UNC 路径映射到本地文件夹 我有一个程序 其中硬编码到程序中的特定文件夹 我想尝试创建一个映射到 UNC 路径的同名文件夹 以便可以从网络共享访问数据 这可行吗
  • R 中的跟踪函数

    我想跟踪一个函数 以便它在调用时打印它的所有参数 当它返回结果时 它会打印返回值和参数 函数跟踪允许定义在进入和退出函数调用时要执行的操作 是否有一个函数返回函数内的参数列表 是否有一种方法无需执行多个分支中的每个分支即可获取结果值 每个分
  • 查找矩阵中的面积数

    假设我有一个像这样的矩阵 1 1 1 0 0 0 1 1 1 0 0 1 0 0 0 0 0 1 如果两个 1 彼此相邻 仅水平和垂直 因此属于同一区域 我需要找出矩阵中有多少个这些区域 您可以看到该矩阵中有两个区域为 1 我已经尝试解决这
  • 当是公共存储库时,什么应该包含 .gitignore 文件?

    我一直在学习有关 gitignore 文件的所有内容 但有一个问题我想解决 gitignore 应包含您要忽略的所有文件 因此 您应该忽略操作系统 您正在使用的 IDE 生成的文件 当存储库位于 Github 上并且人们可以克隆它并推送更改
  • Sass 数组中的随机颜色[重复]

    这个问题在这里已经有答案了 我想指定一个颜色数组 然后将颜色随机应用到列表中 到目前为止 我已经做到了颜色会按顺序循环 我怎样才能随机化它 这是到目前为止的 Sass 代码 colors red orange yellow green bl
  • 根据异常类型调用ContainerStoppingErrorHandler

    我使用的是 spring kafka 版本 2 2 4 Release 和 Kafka 版本 2 11 我在用容器停止错误处理程序作为我的错误处理程序 每当出现异常时 就会调用此方法并停止容器 现在 我需要根据异常类型停止容器 如果发生某些
  • 如何检测特定区域的触摸

    目前我看到触摸事件将向我显示发生触摸的 UIView 但是 如果我需要检测某些非矩形形状 例如圆形 的触摸该怎么办 我该如何去做这样的事情呢 基本上 只有当用户触摸不可见的圆形区域内的某处时 我才想做一些事情 感谢任何帮助 指导 TIA 你
  • 了解 PHP/Laravel 中的构造函数、$this 关键字和控制器类

    我知道以前已经对此进行过介绍 但我正在努力解决如何将其应用到我的代码中 我正在 Laravel 中开发一个 PHP 应用程序 但希望使我的代码更加模块化和可测试 这意味着将我的逻辑从我的重型控制器中分离出来 并将它们分离到单独的文件中 并从
  • WPF 中的下划线标签,使用样式

    我有以下风格
  • JavaScript 和非常长的字符串

    我在使用以下代码时遇到问题 function showTableData var tableArray var x 0 var theHTML for i 0 i lt 7032 i if x 0 theHTML tr th class s
  • 链接到不带 .lib 的 .dll 文件

    我需要将一些Delphi代码重写为C 并且我们需要链接到动态库TMLComm2004 dll 事实证明我们没有 lib文件 因此我们决定使用以下命令行生成它 dumpbin EXPORTS C Users fayard Desktop TM