Visual Studio не показывает предупреждения при отсутствии ошибок (C )

#c #visual-studio #gcc #makefile #visual-studio-2019

#c #visual-studio #gcc #makefile #visual-studio-2019

Вопрос:

Я, наконец, понял, как настроить удаленную отладку Linux (gcc, gdb, makefile project) в VS2019, но у меня все еще есть проблема: всякий раз, когда я создаю свое решение без ошибок, «Список ошибок» вообще не заполняется, несмотря на очевидные предупреждения gcc в окне «Вывод». Эта проблема не возникает, когда код содержит ошибки, и в этом случае как ошибки, так и предупреждения отображаются правильно.

Тестовый код:

 #include <stdio.h>
#include <stdlib.h>

int main() {
    int a = 0;
    printf("Hello Linux!n");
    a = fun();
    return 0;
}

int fun() {
    return 0;
}
 

Makefile:

 all: myprog.c 
    gcc -g -Wall -o myprog myprog.c

clean: 
    $(RM) myprog
 

Окно «Вывод» Visual Studio:

 Build started...
1>------ Build started: Project: Project2, Configuration: Debug x64 ------
1>Build started 04/12/2020 18:00:26.
1>Target _ValidateSources:
1>  Validating sources
1>Target _CopySources:
1>  Copying sources remotely to 'xxx.xxx.xxx.xxx'
1>  Copying file 'C:UsersabcsourcereposProject2Project2myprog.c' to '/home/abc/projects/Project2/myprog.c'
1>  Skipping 'C:UsersabcsourcereposProject2Project2Makefile', as it is up to date.
1>Target Build:
1>  Target _Build_Common:
1>    Target _Clean_BuildUpToDate:
1>      Deleting file "C:UsersabcsourcereposProject2Project2objx64DebugProject2.builduptodate".
1>    Build command not configured, skipping.
1>    Invoking 'make', working directory: '/home/abc/projects/Project2/'
1>    gcc -g -Wall -o myprog myprog.c
1>    myprog.c: In function ‘main’:
1>    myprog.c:7:6: warning: implicit declaration of function ‘fun’ [-Wimplicit-function-declaration]
1>      a = fun();
1>          ^~~
1>    myprog.c:5:6: warning: variable ‘a’ set but not used [-Wunused-but-set-variable]
1>      int a = 0;
1>          ^
1>    Copying file '/home/abc/projects/Project2/myprog' to 'C:UsersabcsourcereposProject2Project2binx64Debugmyprog'
1>
1>Build succeeded.
1>    0 Warning(s)
1>    0 Error(s)
1>
1>Time Elapsed 00:00:00.14
========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========
 

Предложения? Заранее спасибо!

РЕДАКТИРОВАТЬ: пример (РАБОЧЕГО) «вывода» построения программы, содержащей ошибки (эти предупреждения правильно обрабатываются VS):

 Build started...
1>------ Build started: Project: Project2, Configuration: Debug x64 ------
1>Build started 04/12/2020 21:50:23.
1>Target _ValidateSources:
1>  Validating sources
1>Target _CopySources:
1>  Copying sources remotely to 'xxx.xxx.xxx.xxx'
1>  Copying file 'C:UsersabcsourcereposProject2Project2myprog.c' to '/home/abc/projects/Project2/myprog.c'
1>  Skipping 'C:UsersabcsourcereposProject2Project2Makefile', as it is up to date.
1>Target Build:
1>  Target _Build_Common:
1>    Build command not configured, skipping.
1>    Invoking 'make', working directory: '/home/abc/projects/Project2/'
1>    myprog.c(5,12): error : unknown type name ‘hahaha’
1>    myprog.c(6,9): error : expected declaration specifiers or ‘...’ before string constant
1>    myprog.c(7,6): warning : implicit declaration of function ‘fun’ [-Wimplicit-function-declaration]
1>    myprog.c(5,6): warning : variable ‘a’ set but not used [-Wunused-but-set-variable]
1>    gcc -g -Wall -o myprog myprog.c
1>    myprog.c: In function ‘main’:
1>    myprog.c:5:12: error: unknown type name ‘hahaha’
1>      int a = 0;hahaha
1>                ^~~~~~
1>    myprog.c:6:9: error: expected declaration specifiers or ‘...’ before string constant
1>      printf("Hello Linux!n");
1>             ^~~~~~~~~~~~~~~~
1>    myprog.c:7:6: warning: implicit declaration of function ‘fun’ [-Wimplicit-function-declaration]
1>      a = fun();
1>          ^~~
1>    myprog.c:5:6: warning: variable ‘a’ set but not used [-Wunused-but-set-variable]
1>      int a = 0;hahaha
1>          ^
1>    make: *** [Makefile:3: all] Error 1
1>    C:Program Files (x86)Microsoft Visual Studio2019EnterpriseMSBuildMicrosoftVCv160Application TypeLinux1.0Linux.Makefile.Targets(322,5): error : make exited with code 2, please see the Output Window - Build output for more details (NOTE: the build output verbosity might need to be changed in Tools Options to see more information in the Output Window).
1>    Copying file '/home/abc/projects/Project2/myprog' to 'C:UsersabcsourcereposProject2Project2binx64Debugmyprog'
1>  Done building target "_Build_Common" in project "Project2.vcxproj" -- FAILED.
1>Done building target "Build" in project "Project2.vcxproj" -- FAILED.
1>
1>Done building project "Project2.vcxproj" -- FAILED.
1>
1>Build FAILED.
1>
1>myprog.c(7,6): warning : implicit declaration of function ‘fun’ [-Wimplicit-function-declaration]
1>myprog.c(5,6): warning : variable ‘a’ set but not used [-Wunused-but-set-variable]
1>myprog.c(5,12): error : unknown type name ‘hahaha’
1>myprog.c(6,9): error : expected declaration specifiers or ‘...’ before string constant
1>C:Program Files (x86)Microsoft Visual Studio2019EnterpriseMSBuildMicrosoftVCv160Application TypeLinux1.0Linux.Makefile.Targets(322,5): error : make exited with code 2, please see the Output Window - Build output for more details (NOTE: the build output verbosity might need to be changed in Tools Options to see more information in the Output Window).
1>    2 Warning(s)
1>    3 Error(s)
1>
1>Time Elapsed 00:00:02.72
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
 

Редактировать:
Хорошо, я обнаружил, что важен код, возвращаемый командой bash (make).
Кажется, что если «make» возвращает 0, VS даже не анализирует выходные данные, что приводит к 0 ошибкам и 0 предупреждениям. Если я заставляю bash возвращать код ошибки, подобный 127 (например, установив параметр «Построить командную строку» на странице свойств проекта -> «Удаленная сборка» на «make; blablabla», вывод обрабатывается правильно, но компиляция завершается ошибкой из-за неизвестной ошибки, и впоследствии отладка не запускается.

Скриншот списка ошибок VS

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

1. Просто используйте -Werror . Вы все равно должны.

2. @n.’местоимения’m. спасибо за предложение! Да, я знаю, что должен, но я предпочитаю, чтобы они были дифференцированы, если это возможно.

3. Кажется довольно очевидным, что Visual Studio не анализирует предупреждения GCC. Вы можете поискать плагин, который мог бы добавить эту возможность, но в остальном, я полагаю, вам не повезло. Всегда есть Emacs! 🙂

4. @MadScientist Мммм, да, это может быть … спасибо за предложение. Я отредактировал вопрос, добавив некоторые правильно проанализированные выходные данные… Emacs всегда является допустимой альтернативой, хахаха

5. @MadScientist Кажется, что Visual Studio не анализирует предупреждения GCC только тогда, когда код возврата bash равен 0. Я снова отредактировал вопрос. Предложения?