Проблема с cl.exe и ml.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


сегодня я пишу другой код на с

//test.cpp
#include<stdio.h>
void main()
{
  printf("hello");
}

тогда я компилирую код

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

Это может быть разница в C и C++. Это смущает меня несколько дней.:(

как это решить? Помогите мне, пожалуйста.

1 ответ

Решение

При создании кода обработки исключений компилятор создает неверный список сборки. В 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 переопределения и пара неопределенных символов. Кто знает, с чем еще вы столкнетесь, когда попробуете это с более сложной программой?

Другие вопросы по тегам