#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», вывод обрабатывается правильно, но компиляция завершается ошибкой из-за неизвестной ошибки, и впоследствии отладка не запускается.
Комментарии:
1. Просто используйте
-Werror
. Вы все равно должны.2. @n.’местоимения’m. спасибо за предложение! Да, я знаю, что должен, но я предпочитаю, чтобы они были дифференцированы, если это возможно.
3. Кажется довольно очевидным, что Visual Studio не анализирует предупреждения GCC. Вы можете поискать плагин, который мог бы добавить эту возможность, но в остальном, я полагаю, вам не повезло. Всегда есть Emacs! 🙂
4. @MadScientist Мммм, да, это может быть … спасибо за предложение. Я отредактировал вопрос, добавив некоторые правильно проанализированные выходные данные… Emacs всегда является допустимой альтернативой, хахаха
5. @MadScientist Кажется, что Visual Studio не анализирует предупреждения GCC только тогда, когда код возврата bash равен 0. Я снова отредактировал вопрос. Предложения?