【发布时间】: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++ compilerlink是MS commandline linker。 -
@MikeKinghan 哎呀,我的错。我把两者弄混了。