【问题标题】:Unresolved Reference when linking compiled code with NASM and MSVC将已编译代码与 NASM 和 MSVC 链接时未解决的参考
【发布时间】:2016-08-02 20:20:32
【问题描述】:

我正在尝试将程序集(使用yasm 编译)与msvc/cl.exe 编译的对象组合在一起,我试图将其(使用link.exe)链接到.dll,即然后链接到最终的可执行文件。

从源代码创建对象文件和从这些对象创建 dll 都可以正常工作。

在最后一步中,将.dll 与可执行文件链接会出现以下错误:

 error LNK2019: unresolved external symbol xxx_xxxx

我正在使用 C。尽管 Win64 没有名称修饰,但我尝试了多种方案(如 _xxx_xxxx__imp_xxx_xxxx)。

使用dumpbin.exe 检查目标文件会发现所有符号:

$ dumpbin /symbols myobj.o
File Type: COFF OBJECT

COFF SYMBOL TABLE
000 00000000 DEBUG  notype       Filename     | .file

002 00000000 SECT1  notype       Static       | .text
Section length  215, #relocs    0, #linenums    0, checksum        0
004 00000057 SECT1  notype       External     | xxx_xxxx
005 0000013E SECT1  notype       External     | xxx_xxxx
006 00000000 SECT1  notype       External     | xxx_xxxx

但不在.dll的导出符号中:

$ dumpbin /exported mylib.dll
File Type: DLL

  Section contains the following exports for mylib.dll

    00000000 characteristics
    57A0FE02 time date stamp Tue Aug 02 22:09:38 2016
        0.00 version
           1 ordinal base
         132 number of functions
         132 number of names

 [...]

即使我已使用 __declspec(dllexport) 将声明标记为在 .dll 内导出。

任何想法如何满足链接器并告诉他符号确实存在?

【问题讨论】:

  • 您无法使用 Microsoft 的工具将 DLL 链接到可执行文件。您需要使用与 DLL 对应的导入库。
  • @RossRidge 我确实使用生成的导入库。

标签: c visual-c++ assembly nasm yasm


【解决方案1】:

如您所见,问题在于 DLL 没有公开所需的符号。 __declspec(dllexport) 不是导出符号的唯一方法。如果您有一些导出的名称,您可以使用/EXPORT 链接器开关。另一种选择是使用Module-Definition 文件。

【讨论】:

  • 不幸的是,不仅仅是几个功能,使得/EXPORT 不可行。我可以将已经创建的 .lib 与另一个通过 def 文件创建的 dll 链接起来吗?
  • 是的,DEF 文件只是您希望导出的函数列表(加上一些额外的信息)。它不会影响生成的二进制文件的功能。当然,您应该使用dumpbin 检查函数是否出现在导出表中。
  • 虽然这可行,但不幸的是它只是解决方案的一半。我无法手动将每个符号添加到构建标志或 def 文件中。
  • 为什么会这样?应该不会比在源代码中为每个函数添加 dllexport 说明符更难。
  • 难度更大。需要在我的 makefile 中进行特殊处理,维护起来很痛苦,因为我必须导出数百个函数。
猜你喜欢
  • 2011-06-03
  • 1970-01-01
  • 1970-01-01
  • 2019-03-19
  • 2014-04-30
  • 2018-10-16
  • 1970-01-01
  • 2021-02-17
  • 1970-01-01
相关资源
最近更新 更多