【问题标题】:LNK 2001 unresolved external symbol _mainCRTStartup MASMLNK 2001 未解析的外部符号 _mainCRTStartup MASM
【发布时间】:2012-09-04 23:29:17
【问题描述】:

我正在我的大学学习汇编,我们得到了一张带有 MASM 615 的 CD,我们正在使用 Irvine32 包含库。在学校计算机上一切正常,但是当我尝试在家用计算机上编译和运行相同的代码时,出现链接错误。

INCLUDE Irvine32.inc

.code
main PROC

mov eax,10000h      ; EAX = 10000h
add eax,40000h      ; EAX = 50000h
sub eax,20000h      ; EAX = 30000h
call DumpRegs

exit
main ENDP
END main

此代码在学校的 PC 上运行良好。在家里,我进入DOS,设置MASM文件夹的路径,然后做Make32文件。

这是我得到的错误:

LINK32 : error LNK2001: unresolved external symbol _mainCRTStartup
test.exe : fatal error LNK1120: 1 unresolved externals

程序编译(我得到 .lst、.obj 和 .pdb 文件),但仅此而已。我在想这是因为我家里有一个 64 位操作系统,但我对如何在 64 位环境中启动和运行它一无所知——CD 或书在 64 位系统上没有任何内容。只有一个 make16 或 make32 .bat 文件。这真的很糟糕,因为这意味着我不能在家做任何工作,除非有工作?

【问题讨论】:

  • 程序汇编和链接 NOT 编译。使用 Assembly 时不编译任何内容。你能发布你正在使用的make文件吗?
  • 听起来好像没有找到与 libc 等效的“打瞌睡”。执行“set”命令查看环境变量。寻找“LIB”变量。比较你在学校和家里看到的东西。您可能需要安装 C 编译器(在家)才能获得 C 库。缺少的变量在您的“C 启动代码”中 - 调用“_main”的代码。可能只需要设置“LIB”变量...
  • 这个问题没有“Make32 文件”是无法回答的。

标签: assembly linker masm irvine32


【解决方案1】:

其他答案让我感到困惑,所以我将添加我的解决方案。 在项目的属性中转到

配置属性>>链接器>>高级

在顶部的Advanced中应该是Entry Point。输入main

【讨论】:

  • 我可以确认这就是答案。附带说明:它也适用于 nasm。
【解决方案2】:

我认为您可能需要手动指定入口点,因为 Windows 上的默认入口符号不是 _main,而是错误消息中的 _mainCRTStartup 之一。您可以在链接器选项中使用/ENTRY:entry_point(程序集中的某些过程)指定入口点。

【讨论】:

  • 上面的链接好像坏了。
  • 我还是有点迷茫:在汇编语言源代码中怎么指定入口点?
  • 链接是别人加的,和我没关系。入口点将被指定为链接器的命令行参数,而不是在代码中。
【解决方案3】:

我知道它有点晚了 - 也许它对某人有帮助 - 但你应该公开 main ,像这样

INCLUDE Irvine32.inc

.code
main PROC

mov eax,10000h      ; EAX = 10000h
add eax,40000h      ; EAX = 50000h
sub eax,20000h      ; EAX = 30000h
call DumpRegs

exit
main ENDP

PUBLIC main

END 

注意倒数第二行

【讨论】:

    【解决方案4】:

    尝试加入这个

    includelib  \Irvine\Irvine32.lib
    includelib  \Irvine\User32.lib
    includelib  \Irvine\kernel32.lib
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-02-26
      • 1970-01-01
      • 1970-01-01
      • 2011-10-02
      • 2013-05-02
      • 2016-06-02
      • 1970-01-01
      相关资源
      最近更新 更多