cl.exe和ml.exe的问题

Sim*_*mon 5 c++ compiler-errors cl.exe visual-studio

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

cl test.cpp  //the generated  test.exe can work well
Run Code Online (Sandbox Code Playgroud)

然后我用另一种方式:

cl /Fa /c test.cpp   //generate a test.asm assembly file
ml test.asm   // there failed!!!
Run Code Online (Sandbox Code Playgroud)

为什么?怎么解决?

源代码:

//:test.cpp 

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

错误的信息:

组装: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");
}
Run Code Online (Sandbox Code Playgroud)

然后我编译代码

cl /Fa /c test.cpp
ml test.asm //ok!
Run Code Online (Sandbox Code Playgroud)

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

怎么解决?请帮我.

Mic*_*urr 7

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

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

看起来您可以对此特定问题进行"脚本化"修复:

  • 切断ENDP声明后的text$x ENDS陈述,
  • 在前一个_TEXT ENDS语句之前粘贴它

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

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