C ++ MSVS, какой файл "очистки" я должен делать? (ошибка cl: D8037) - PullRequest
4 голосов
/ 21 декабря 2011

Работая в C ++ MSVS2008, у меня возникали все более и более раздражающие проблемы: точки останова выполнялись не на той строке, не перехватывали и т. Д. Это действительно большое рабочее пространство с тысячами файлов, поэтому я "смирился с этим".

Я прошел "стандартные" вещи (чистые, "глубокие" чистые, вручную удалил *.idb, *.pdb, *il* и т. Д.). Это не исправило "точку останова на неправильной линии" "проблема, но все по крайней мере скомпилировано, и я могу запустить / отладить.

ТО, (по несвязанным причинам) я создал программу командной строки, которая выполнила команду compile-one-CPP-to-OBJ, и получил странную ошибку:

cl : Command line error D8037 : cannot create temporary il file; clean temp directory of old il files

Я никогда не слышал об этом раньше, поэтому веб-поиск привел меня на сайт Microsoft, где подробно описана ошибка:

http://msdn.microsoft.com/en-us/library/bb385201(v=VS.90).aspx

Хм, а? В моей системе TMP dir было явно слишком много файлов _CL_hhhhhhhh.ss. Поиск, да, у меня было ровно 6,063 этих файлов в этом каталоге, примерно год назад.

Я никогда не слышал об этих файлах раньше ("временные файлы компилятора"). Поиск на сайте Microsoft показывает, что эта ошибка возможна в , по крайней мере, MSVS 2005, 2008, 2010. Будучи «временными» файлами, я предполагаю, что существует какой-то алгоритм «очистки» или «перезапуска»?

  • Сколько файлов _CL_hhhhhhhh.ss является пределом? (У меня была эта ошибка при одном условии в 6,063.)

  • Почему я вижу эту ошибку, когда выполняю «компиляцию» из EXE-файла, а не из-за IDE MSVS? (Я не вижу этой ошибки, когда я выполняю «компиляцию» непосредственно из командной строки.)

  • Должен ли я выполнять «техническое обслуживание» своего компьютера для разработки, периодически очищая файлы, подобные этим?

  • Какие еще "ненужные" файлы мне нужно подумать о поиске и удалении?

Кроме того, я знаю, что GUID проекта MSVS кэшируются в реестре, так что среда IDE может "находить" файлы проекта, которые перемещаются вручную, чтобы "восстанавливать" ссылки / зависимости с другими файлами проекта. Я бы тоже хотел знать, как их почистить, если у кого-нибудь есть предложение.

* * * * * * * * * * * * * * * * * * * * * * * * * * * 1050 * * * * * * * * * * * * * * * * * * * * * * * *1048* * * * *1048* 1050

Win7 / 64, C ++ MSVS 2008, NTFS

Ответы [ 2 ]

1 голос
/ 25 мая 2012

cl.exe при запуске через CreateProcess не имеет разрешения на запись отвечает на ваш второй вопрос.Почему вы видите его только при запуске из exe-файла?

Скорее всего, cl.exe не работает в другом месте.Если вы используете Process Monitor, он даст вам хорошее представление обо всех системных вызовах, выполняемых cl.exe и о том, что не удалось.

В моем случае я переопределял переменные среды при вызове CreateProcess и в этом процессезакончилась сбросом переменной среды SystemRoot.cl.exe использует его для разрешения путей для некоторых системных библиотек и в результате никогда не заканчивал тем, что находил библиотеку.

Краткосрочным исправлением было добавление «SystemRoot = c: \ windows» в настройки среды, в которых я находился.переходя в CreateProcess.

Правильным долгосрочным исправлением является получение переменных среды, их синтаксический анализ, изменение и добавление только по мере необходимости и передача всего этого блока переменных среды в CreateProcess.Таким образом, cl.exe, запущенный через CreateProcess, наследует переменные среды, с которыми запускается ваш exe.

1 голос
/ 02 апреля 2012

Я не уверен, был ли конкретный файл, с которым у вас возникли проблемы, достаточно большим (больше 10000 строк), но у меня была такая же проблема, когда точки прерывания находились на неправильных строках несколько раз при таких обстоятельствах в MSVS2008. Решение, которое сработало для меня (и улучшило читабельность кода), заключалось в том, чтобы логически сгруппировать несколько функций в пространство классов / имен и поместить их в новый файл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...