我正在阅读一本通过Visual C ++ Express使用MASM教授装配的书。
本书提供了以下示例程序来测试masm是否正常工作
.386
.model flat, c
.stack 100h
printf PROTO arg1:Ptr Byte, printlist:VARARG
.data
msg1fmt byte "%s%d",0Ah,0
msg1 byte "The answer is: ",0
num1 sdword ?
num2 sdword ?
.code
main proc
mov num1,5
mov eax,num1
mov num2,eax
INVOKE printf, ADDR msg1fmt, ADDR msg1, num2
ret
main endp
end
然后我收到错误 LNK2005:_main已在asm.obj中定义
我正在使用我书中的样本汇编程序,所以希望它没有错误。我得到的错误似乎与主要列出两次有关,但我不确定如何解决它。
答案 0 :(得分:1)
对于书籍中的编程示例来说,出错是完全没有闻所未闻的。
请注意,您获取的错误来自链接器,而不是汇编程序。您到目前为止的事实已经表明汇编程序对您的文件感到满意,而且汇编文件确实只定义了main
一次。
我不熟悉MS开发工具,尤其是不熟悉过去十五年的开发工具,但我想您已经为定义main()
的项目添加了C或C ++模块作为该语言的一个功能,或IDE是有帮助的"提供默认定义。这是链接器不满意的main
的第二个定义。
(链接器中的符号下划线的错误消息只是您在该平台上执行操作的工件 - 所有HLL符号都以下划线为前缀。我注意到您有.model flat, c
- 尽管汇编不是高级语言,但可能会告诉MASM为符号添加前缀。)
您可以尝试在项目的C-land部分中查找main()
的定义,只需删除它或从项目中省略它,如果您能找到它。如果做不到这一点,请将您的汇编函数重命名为asm_main
,然后从C-land调用 :
int main() {
return asm_main();
}
(这只是为了让你前进;如果你想抓住argc
等,你需要更有创意。)