【问题标题】:NASM: How to resolve these unresolved externals?NASM:如何解决这些未解决的外部问题?
【发布时间】:2016-02-22 17:34:55
【问题描述】:

我正在尝试从 Paul A. Carter 的书“PC 汇编语言”开始学习基本汇编。但是我无法运行 Carter 提供的第一个示例,所以在我弄明白之前我有点卡住了。

我毫无问题地组装了示例“first.asm”,但我不知道如何将这些文件:first.obj、driver.c、asm_io.obj 链接到可执行文件中。在 first.asm Carter 的评论部分给出了创建可执行文件的这些说明(我使用的是 Windows 10,VS community 2015 开发人员命令提示符):

    ; Using MS C/C++
    ; nasm -f win32 first.asm
    ; cl first.obj driver.c asm_io.obj

我正在这样做,但我遇到了一个致命错误 2 unresolved externals,_printf 和 _scanf。我在同一个目录中有我能想到的所有必要文件,我正在那个目录中编译。 Driver.c 调用定义的函数,它使用一个名为“CDECL.h”的头文件;我的目录中有这个文件,但我对这个头文件不太了解。我想知道问题是否在这里。我没有改变它或任何东西。我按照 Carter 博士的指示组装了 asm_io.asm。

在 asm_io.asm 中不远的地方是这样的:

    extern  _scanf, _printf, _getchar, _putchar, _fputs

所以这里是未解决的外部问题。它们不应该在 stdio.h 中定义吗? Driver.c 包含 stdio.h,链接器不应该能够解析这些符号正在查看 stdio.h 吗?我可能会错过什么?

ps。我一般是编程新手,这是我的第一个堆栈溢出问题。我愿意接受任何和所有的批评/反馈。如果您需要,我会提供更多信息,我只是不想在没有必要的情况下发布大量文字和代码。

【问题讨论】:

  • cl 是一个链接器,不能吃 c 文件。这些函数也由 CRT 定义,包括它们在其中实现的任何库。
  • @MargaretBloom cl MS commandline C/C++ compiler linkMS commandline linker
  • @MikeKinghan 哎呀,我的错。我把两者弄混了。

标签: linker nasm


【解决方案1】:

欢迎来到 SO。你需要明白:-

头文件的区别,例如

foo.h // C or maybe C++ header file)

还有一个,例如

foo.lib  foo.dll // Windows
libfoo.a, libfoo.so // Unix/Linux

实现了(仅)在头文件中描述的调用接口。

编译或组装源文件的区别,例如

bar.c // C source file
bar.asm // Assembly source, Windows
bar.s // Assembly source, Unix/Linux

制作一个目标文件。例如

bar.obj // Windows
bar.o // Unix/Linux

链接目标文件和库一起构成一个完整的可执行文件。

只有在提供链接器时链接才能成功(或默认情况下知道) 提供的目标文件和/或库的名称和位置 程序中调用的所有函数的实现——包括 调用接口在头文件中描述的函数。除此以外 未解决的符号错误随之而来。

研究这些要点,您很快就会摆脱困境。请参阅this pretty good introductory tutorial,虽然它是关于获取 从GNU Compiler Collection 开始 比用汇编语言编程,会理清原理 以及您需要掌握的区别。

【讨论】:

  • 非常感谢您的帮助!目前正在研究:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-13
  • 2021-06-13
  • 2020-10-15
  • 2011-12-19
  • 2012-05-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多