cl.exe和ml.exe的问题

时间:2011-09-20 15:52:32

标签: c++ visual-studio compiler-errors cl.exe

我使用cl命令编译cpp文件:

cl test.cpp  //the generated  test.exe can work well

然后我用另一种方式:

cl /Fa /c test.cpp   //generate a test.asm assembly file
ml test.asm   // there failed!!!

为什么呢?怎么解决?

源代码:

//:test.cpp 

 #include<iostream>
 using namespace std;
 int main()
  {
    cout<<"hello\n";
  }

错误的信息:

  

组装:test.asm   test.asm(1669):致命错误A1010:不匹配的块嵌套

     

:?? $?6U?$ char_trait   s @ D @ std @@@ std @@ YAAAV?$ basic_ostream @ DU?$ char_traits @ D @ std @@@ 0 @ AAV10 @ PBD @ Z


今天我在c

中写了另一段代码
//test.cpp
#include<stdio.h>
void main()
{
  printf("hello");
}

然后我编译代码

cl /Fa /c test.cpp
ml test.asm //ok!

可能是C和C ++的不同之处。这让我困惑了几天。 :(

如何解决?请帮帮我。

1 个答案:

答案 0 :(得分:7)

生成异常处理代码时,编译器会生成无效的程序集列表。 Microsoft Connect上打开了一个错误:http://connect.microsoft.com/VisualStudio/feedback/details/556051/cl-facs-generates-bad-masm-for-c-exception-handlers

在对这个漏洞的回应中,有一个半心半意的“我们将考虑修复此问题”以及“C / C ++编译器生成的列表文件仅供参考”的免责声明。

看起来您可能能够针对此特定问题进行“脚本化”修复:

  • 删除ENDP语句后面的text$x ENDS语句
  • 将其粘贴到上一个_TEXT ENDS语句
  • 之前

至少看起来是你的简单程序生成的asm文件中的模式 - 我不知道这种模式是否会普遍存在。

不幸的是,在应用此修复程序后,使用fs覆盖和几个未定义符号的指令会出现几个新问题。谁知道一旦你用更复杂的程序尝试了这个,你会遇到什么?