Проект Visual Studio makefile не показывает ошибок в редакторе

#visual-studio #visual-c #arm

#visual-studio #visual-c #arm

Вопрос:

Я использую компилятор ARM (RVDS) и использую Visual C 2005 Express в качестве IDE, потому что я не поклонник старой версии Eclipse, которую выбрала ARM. Я создал проект makefile, который выполняется правильно. К сожалению, при возникновении ошибки компиляции ошибка отображается на панели «Ошибка», но двойной щелчок по ошибке не открывает файл в редакторе.

На панели «Ошибка» отображается правильный файл, но номер строки пуст. Есть ли способ заставить Visual C лучше анализировать сообщения об ошибках, извлекать правильные номера строк и связывать ошибки с редактором?

ОБНОВЛЕНО: Visual C правильно проанализировал выходные данные компилятора, когда я создал решение / проект в том же каталоге, что и makefile или скрипты сборки. У меня была эта проблема только тогда, когда решение / проект был создан в каталоге, отличном от makefile.

Ответ №1:

В прошлом я использовал скрипт, который фильтровал сообщение об ошибке моего стороннего компилятора в формат, ожидаемый Visual Studio. С тех пор я потерял скрипты (из-за того, что они не понадобились через некоторое время, из-за смены задания и т.д.).

Вот зеркало публикации в группе новостей Microsoft (я не могу найти сообщение в группах Google), в котором описывается аналогичный процесс вместе со сценарием sed:

Соответствующая информация заключается в том, что конфигурация VS build запускает инструмент и передает выходные данные с помощью сценария sed:

 CALL mm.bat 2<amp;1 | sed -u -f ....errfix.sed
  

и сценарий sed:

 #------- START errfix.sed
#MPC561 - TYPE:1 ID:2 FILE:3 LINE:4 POS:5 REST:6
s/^(([EWI])) ([A-Z][0-9]*-*[A-Z]*); "(.*)", line ([0-9]*) pos ([0-9]*); (.*)/3(4) : (1) 2 : 6/
s/(E)/Error/g
s/(W)/Warning/g
s/(I)/Informational/g
s/..\..\..\cu\//
s/..\..\../../
#------- END
  

Я полагаю, что скрипт нужно было бы адаптировать к вашему конкретному инструменту — на первый взгляд скрипт выглядит довольно пугающим (по крайней мере, для меня), но я бы поспорил, что было бы не слишком сложно заставить его массировать вывод до того, что ожидает VS.

Комментарии:

1. В моем случае s/^(([EWI])) ([A-Z][0-9]*-*[A-Z]*); "(.*)", line ([0-9]*) pos выдает: sed: file errfix.sed line 2: unterminated s’command`

2. @user3007735: Я полагаю, что из-за проблемы с вырезанием и вставкой из исходного сообщения первая строка скрипта sed разделяется на две части. Имейте в виду, что я понятия не имею, какие сообщения об ошибках преобразовывал этот сценарий sed. Сценарий sed — это всего лишь пример того, как сообщение об ошибке из одного инструмента может быть преобразовано в другое, которое может использовать VS.

3. Да, вы правы, я это исправил, он работает нормально, но по-прежнему VS 08 не показывает ошибок или предупреждений. 🙁

4. @user3007735: имейте в виду, что сценарий sed написан для переформатирования определенных сообщений об ошибках. Если ваш инструмент выдает разные сообщения (что вполне вероятно, поскольку я даже не знаю, для работы с каким инструментом был написан скрипт), то вам нужен другой скрипт.

5. @MichaelBurr Ссылка, которую вы указали в этом вопросе, теперь стала какой-то формой спам-сайта.

Ответ №2:

На случай, если кто-то еще столкнется с этой проблемой. Вот что у меня получилось:

 make -f $(TargetName).mak  2<amp;1 | sed -e 's|/cygdrive/([a-z])/|1:/|' -e 's/.([ch]):([0-9]*)/.1 (2)/' ; exit ${PIPESTATUS[0]}
  

Это работает для форматов ошибок gcc в файле.c: строка #: ошибка desc (например, main.c: 12: HelloWorld не определен)

Бит 2<amp; 1 гарантирует, что мы также фиксируем stderr, первая замена sed заменяет отображение диска cygwin обратно в Windows (в моем случае), а вторая заменяет формат :dd: error на (dd): для файлов, заканчивающихся на .c или .h.

наконец, статус завершения make поддерживается с помощью бита exit $ {PIPESTATUS[0]}, чтобы visual studio не считала, что сборка выполнена успешно только потому, что sed выполнен успешно.