将编译代码与NASM和MSVC链接时未解决的参考

时间:2016-08-02 20:20:33

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

我试图将程序集(使用yasm编译)与msvc / cl.exe编译的对象结合起来,我试图链接(link.exe 1}})到.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

 [...]

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

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

1 个答案:

答案 0 :(得分:2)

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