你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

一款Win10下好用的C语言编辑器

[复制链接]
gaosmile 发布时间:2020-6-3 21:06
01
前言
$ D6 K, p4 T$ ~" b7 j
有位朋友让我推荐一款Win10下好用的C语言编辑器,我毫不犹豫的选择了VSCode。免费、小而快、插件多这三点是我选择它的理由,本文就详解VsCode下编译、配置、调试C代码。(长文和多图预警!!可以收藏需要安装和配置时参考)
02
环境准备

5 X$ r2 L. n9 D  c8 v
编译器,VSCode只是个编辑器,C语言编译器要另外下载安装,笔者使用的MinGW64,安装好后一定不要忘记配置好环境变量,可以使用gcc -v确认编译器是否配置好。
微信图片_20200603210430.png
VScode 官网下载安装。
03
编译运行

& ^, u7 F# Y$ _
命令行编译运行
新建C文件,熟悉的HelloWorld。
微信图片_20200603210434.png
这个时候可以使用命令行运行,VSCode菜单栏Terminal--->new Termial   如下进入目录直接运行。
微信图片_20200603210438.png
一键运行
打开VSCode 安装下面俩个插件
微信图片_20200603210440.png
安装好后选中c文件点击VSCode右上放的三角或者使用Ctrl+Alt+N即可运行。运行结果如下
微信图片_20200603210443.png
多文件编译运行
上面讲述的都是单个文件的时候运行,从上面了解到其实Code Runner只是代替你手动输命令,当你需要少量的多文件运行,可以更改settings.json的gcc命令来实现。以如下目录结构为例,VSCode打开工作目录,
微信图片_20200603210446.png
Ctrl+Shift+P  搜索settings  打开JSON文件
微信图片_20200603210449.png
把settings.json 修改如下:

  1. & u9 G, v) j& }3 C
  2. {
    & O4 Y; I6 Q3 u, S
  3.     "files.autoGuessEncoding": true,
    ; l: y7 G6 c3 I) `8 E
  4.     "code-runner.runInTerminal": true,
    . t' K* z) X: [) w
  5.     "files.associations": {},
    " ]0 R/ B7 n' y9 |/ e8 u/ `
  6.     "code-runner.executorMap": {* g  L' a8 y" I% k* d2 L# ]
  7.         "c":"cd $dir && gcc *.c ../../hello2/src/*.c ../../hello1/src/*.c -I ../inc/ -I ../../hello2/inc/ -I ../../hello1/inc/ -o $fileNameWithoutExt && $dir$fileNameWithoutExt",( g0 i$ _( R# ?& P2 K1 t, z" v$ R
  8.     },
    0 ]* o9 F. ^! b' @2 x! [: g
  9. }
复制代码
# B- q+ n, \/ S1 A% h- m; S
其实就是按照gcc 源文件1.c 源文件2.c -I incPath1 -I incPath2的命令修改即可,注意头文件的路径可以是相对路径也可以是绝对路径,如果#include的时候把头文件的路径加上,gcc 编译的时候可以不用把路径加上。当程序文件很多架构大时,需要学习makefile的编写,使用make命令。还是以上面的文件为例。
Makefile文件

  1. , g: t: e" g% v
  2. MainExt     =.exe
    8 i- H' [6 d( y8 }. }- U; Y
  3. SourceExt   =.c: t. w: S3 j1 e" \9 r  W% `
  4. TargetExt   =.o
    ; k& x9 E6 ], B' d5 J, u7 x
  5. ( N" }, P, I1 W$ J: B/ f! \: [
  6. OBJ_DIR := obj
    ( G' r% U' J: e. u5 V+ L4 S9 Y
  7. BIN_DIR := bin
      G( l8 x  u. Y2 Q. b
  8. MAIN_SRC_DIR := main/src
    ( Q2 m: i& m  a# t8 Z
  9. MAIN_INC_DIR := main/inc% G# ]# k+ f& P# }
  10. HELLO1_SRC_DIR := hello1/src. R! \6 q' J8 k! Q, x+ |
  11. HELLO1_INC_DIR := hello1/inc
    3 \& [. V4 Z9 @- C4 Q
  12. HELLO2_SRC_DIR := hello2/src9 T$ x  a$ _8 {9 P
  13. HELLO2_INC_DIR := hello2/inc
    # |3 _, R2 B* v, q
  14. 8 A6 M/ D7 d( m- T6 T+ n4 P1 }
  15. cc := gcc+ L: F% k; ^9 r0 Z$ ?
  16. CFLAGS := -g -Wall -I./$(MAIN_INC_DIR) -I./$(HELLO1_INC_DIR) -I./$(HELLO2_INC_DIR) -DDEBUG  G. }( ?, d4 p/ R7 b3 O

  17. 7 t( G; C- w! i; E
  18. MAIN_SRCS := $(wildcard $(MAIN_SRC_DIR)/*.c); D5 G9 ^# h# V9 h
  19. MAIN_HDRS := $(wildcard $(MAIN_INC_DIR)/*.h); f& p% X+ s, g8 q3 o. ^
  20. HELLO1_SRCS := $(wildcard $(HELLO1_SRC_DIR)/*.c): J6 K3 L/ x5 w, R% u) `1 p4 s
  21. HELLO1_HDRS := $(wildcard $(HELLO1_INC_DIR)/*.h)7 M4 s- e, ^. H" B8 K5 K6 m' T$ w
  22. HELLO2_SRCS := $(wildcard $(HELLO2_SRC_DIR)/*.c)! ~1 U0 `5 C$ O7 G5 F& D& ]
  23. HELLO2_HDRS := $(wildcard $(HELLO2_INC_DIR)/*.h)
    9 \: z% B' D- R- q! @1 k
  24. OBJS := $(patsubst $(MAIN_SRC_DIR)/%.c,$(OBJ_DIR)/%.o,$(MAIN_SRCS))
    ' q* b8 Q0 ?  W0 @
  25. OBJS += $(patsubst $(HELLO1_SRC_DIR)/%.c,$(OBJ_DIR)/%.o,$(HELLO1_SRCS))
    9 W1 b, a- |0 ]/ D* ^- j
  26. OBJS += $(patsubst $(HELLO2_SRC_DIR)/%.c,$(OBJ_DIR)/%.o,$(HELLO2_SRCS))
    * G) X( H: Q9 }4 \" W+ v# x7 G

  27. ! z$ w; \( t" l. p9 h
  28. TARGET := $(BIN_DIR)/main$(MainExt)
    ) p, Y3 d/ W* B1 U" ?3 B# S

  29. 2 ]( S0 G6 m( {. G
  30. .DEFAULT_GOAL := $(TARGET)
    ! \: `8 A7 |0 @/ Y- b/ U4 [

  31. ( o. K% g/ M% r5 k/ {; a
  32. $(TARGET): $(OBJS)8 k6 A+ R2 f" c% Y+ h: R3 ?
  33.   $(cc) $(CFLAGS) -o $@ $^$ U- v( J- U6 m# @2 A$ w

  34. * j. L0 {7 W! }: P
  35. $(OBJ_DIR)/%.o: $(MAIN_SRC_DIR)/%.c: V" u0 _6 s, Y3 a' S
  36.   $(cc) $(CFLAGS) -c -o $@ lt;. o& `4 \: r- i+ p$ ~# A( e( H  v

  37. 5 h+ Q# a! e( ~8 U
  38. $(OBJ_DIR)/%.o: $(HELLO1_SRC_DIR)/%.c/ F  J  l. X" C: N
  39.   $(cc) $(CFLAGS) -c -o $@ lt;6 k8 T% Y: ]3 o% x$ g8 q

  40. # H$ [7 v" c7 U( ]' {
  41. $(OBJ_DIR)/%.o: $(HELLO2_SRC_DIR)/%.c
    - V9 }# j3 Z! A1 X; t
  42.   $(cc) $(CFLAGS) -c -o $@ lt;3 }) E- ^2 n  }/ i
  43. + i2 _  ^8 u& y* D8 s& d  l
  44. .PHONY: clean
    : C* e% Y/ a# j# X: ^
  45. clean:, U/ N0 V4 e5 z4 C6 m
  46.   del .\$(BIN_DIR)\*.exe
    # n4 J3 f6 f) {( l8 W4 m
  47.   del .\$(OBJ_DIR)\*.o
复制代码

; v  m- J9 J& F- X- g: V
把settings.json 修改如下:
  1. ( m5 I* t( H4 O( I8 G
  2. {: v1 r& r3 w( q/ q
  3.     "files.autoGuessEncoding": true,# G% D8 d) ]* p3 u' {
  4.     "code-runner.runInTerminal": true,
    ( O  Q& K) A$ s1 R  H) j9 T7 f
  5.     "files.associations": {},/ H' o- ?% x3 a9 Q8 H% j. z
  6.     "code-runner.executorMap": {
    6 Z# s+ l- u( H8 _2 J
  7.         "c":"make && ./bin/main.exe",; M2 r4 _/ S6 B. R
  8.     },# o. F0 l4 s( u# ~3 P
  9. }
复制代码
- Q% w: [; r7 x+ b$ S- l
运行结果
微信图片_20200603210452.png
注意:win10下make命令要和编译器安装路径下的make可执行文件一致,我是把安装路径D:\Program Files\mingw64\bin\minGW64-make.exe修改为make.exe,不修改要使用minGW64-make命令
04
调试

& m9 L: a% s/ ^6 A+ c* `( z
我们经常要调试代码,下面来看看调试的配置。
  A. F) q! ]# ~; R( A: ~/ Z! T
打开工作目录(调试的话工作路径不能含有中文) 在工作目录下新建文件.vscode并创建tasks.json 和launch.json,可以手动创建也可以Ctrl+Shift+P  弹出的对话框中搜索后根据引导创建。
微信图片_20200603210454.png
创建完成后根据自己的需求修改内容,下面给出单文件和多文件的一个示例。
单个文件调试
launch.json 配置内容如下:
  1. 3 n  e" {7 c2 g/ `' A1 f: ], A
  2. {
    ( A5 ~. n' ]& o5 z+ K6 @+ g( q/ r+ r+ b
  3.     // Use IntelliSense to learn about possible attributes.- G& Y# w% V% u0 V
  4.     // Hover to view descriptions of existing attributes.4 p+ r" j1 _; ]& D. k1 ^5 Y
  5.     // For more information, visit: http://go.microsoft.com/fwlink/?linkid=830387" Q* s7 P8 ~0 z9 o8 V
  6.     "version": "0.2.0",
    ) Q7 A' W3 a# J0 S; i
  7.     "configurations": [4 I- ~  h8 o- x, k9 ^
  8.         {; j" O0 X8 j7 D1 R' Q0 v6 |
  9.             "preLaunchTask": "Build", //调试会话开始前执行的任务,一般为编译程序。与tasks.json的label相对应
    % b* F  d! c) H/ Z! I# S
  10.             "name": "(gdb) Launch", //配置文件的名字,可以随便起
    1 p( ^; g( c5 ]) f, l! X/ S
  11.             "type": "cppdbg", //调试的类型,Vscode现在支持很多,我这里主要是C,所以只能是cppdbg
    9 f& y3 P4 i- Y/ ~2 b
  12.             "request": "launch",//配置文件的请求类型,有launch和attach两种,具体看官方文档
    1 ~2 Q/ P" n4 N7 b" T, k8 a8 {9 T* b
  13.             "targetArchitecture": "x64", //硬件内核架构,为64bit,如图设置) M; b! {/ a) J' |1 F/ ^
  14.             "program": "${workspaceFolder}/${fileBasenameNoExtension}.exe",//可执行文件的路径和文件名称
    1 D) k" g( c- }, P0 h/ Q( z8 D
  15.             "args": ["file1", "file2"],//主函数调用时传入的参数
    4 `) C8 _( i& I, e# ?
  16.             "stopAtEntry": true,//设为true时程序将暂停在程序入口处/ a2 e" ~/ O0 l( A8 ~1 r2 o$ j
  17.             "cwd": "${workspaceFolder}",//调试时的工作目录
    : K5 `4 u$ h, p2 D& F: n% G5 O
  18.             "environment": [],
    # d# @& L& @' f8 }* L
  19.             "internalConsoleOptions": "openOnSessionStart",//false8 u. d) F  T4 l7 K
  20.             "externalConsole": false,//调试时是否显示控制台窗口3 v5 A5 Q5 n1 W- u+ g# |! @
  21.             "MIMode": "gdb",//指定连接的调试器,可以省略不写6 Z/ ^8 h2 Z8 B
  22.             "miDebuggerPath": "D:/Program Files/mingw64/bin/gdb.exe",//安装minGW具体路径 更据自己安装的目录修改( I  w2 p" W; w$ S/ b$ I3 `
  23.             "setupCommands": [
    % F  i$ ?/ p9 l
  24.                 {8 L# W4 L0 v7 n# [: I! Y5 I
  25.                     "description": "Enable pretty-printing for gdb",
    ) T/ }( V' L, L2 W/ u
  26.                     "text": "-enable-pretty-printing",
    4 w) x* G2 R0 ]; q0 d+ g
  27.                     "ignoreFailures": true. F# C. p. J+ L5 P( e2 V
  28.                 }
    " h& C6 G) g$ u0 l3 D
  29.             ]8 n+ O/ z- L$ \8 I7 s0 J* X
  30.         }
    ! t( W! J: p. u! \
  31.     ]
    # ^: J+ `$ R# O1 {, B
  32. }
复制代码
, z/ _" Y- n- |% ~1 L
tasks.json 配置内容如下:
  1. , R, D, P, P* H: D# d
  2. {
      C8 b0 J4 J* S
  3.     // See http://go.microsoft.com/fwlink/?LinkId=733558, G$ `. g. o* t8 D# J
  4.     // for the documentation about the tasks.json format5 h5 R0 b& r6 N
  5.     "version": "2.0.0",
      {" k) `6 v- [) Y
  6.     "tasks": [
    6 ]' C. E6 C4 ?- V1 f% {' Y' Y2 f
  7.         {) S/ D' `4 H) h+ w( L0 s
  8.             "label": "Build",# C; X8 s4 v( h4 R5 h- |4 R
  9.             "type": "shell",
    / |6 F9 M* j% B6 [' j& w
  10.             "command": "gcc",: ?- B1 u6 c' ]+ E6 _
  11.             "args": [" T$ Z1 V4 U8 }( s3 u& U, c
  12.                 "-g",$ V: h' B$ s% @- V: Y+ r4 Q, A
  13.                 "-o",0 R( Y1 ^1 a! F5 _9 c# `
  14.                 "${fileBasenameNoExtension}",
    3 r3 l) Z' z  A( E$ J! |  Y
  15.                 "${fileBasenameNoExtension}.c",
    1 ?5 U3 r7 f* Z3 u' H( _+ ~0 L
  16.             ],9 y) G% M3 D8 Q9 o8 r6 O' B
  17.             "group": {
    * Z; x1 ~* {3 B3 N
  18.                 "kind": "build",
    + m1 T+ o. s8 o, K& `' t' H
  19.                 "isDefault": true
    9 c# n6 y# ?# |
  20.             }
    : i: M' W: p( K4 M* G: @
  21.         }  G+ n; B% Q6 V2 ]. y3 P& ^' o8 E
  22.     ]# G% ^0 j$ J- `6 S
  23. }
复制代码

3 Q& j- H3 N8 N: k3 B
6 J* K8 W. A4 I
配置完成后选择待调试的目标文件,按F5就可以调试代码。
微信图片_20200603210457.png
多个文件调试
和上面配置CodeRuner的Settings.json一样当少量文件时我们可以简单的修改tasks.json中的gcc命令实现。以前文的目录结构为例修改后的tasks.json:

  1. 5 q4 A: O. J4 t
  2. {
    / s2 i/ t$ Y- j9 L
  3.     "version": "2.0.0",. G) E+ V7 j% [! g% k& V' e' k0 g
  4.     "tasks": [
    . c# I% P# o' K+ }2 `6 w
  5.         {
    ; [  f8 [' i6 n) s: B0 d: g
  6.             "label": "Build",
      w1 v& C8 l& d
  7.             "type": "shell",- c/ P# T8 c5 O  j8 z; Z( c" @$ L
  8.             "command": "gcc",
    & u5 q+ D# V! M6 j* _2 j. @- O
  9.             "args": [6 `  B/ B+ f% d
  10.                 "-g",
    " Z& S5 C& p" z
  11.                 "-o",# l) g  Q5 e" K+ W
  12.                 "${fileBasenameNoExtension}",. y- {9 f8 i/ R& |2 r
  13.                 "main/src/${fileBasenameNoExtension}.c",
    / T1 d. T  B8 q5 O; G% m
  14.                 "hello1/src/*.c",
    " T/ O6 o4 t; T/ u, I
  15.                 "hello2/src/*.c",
    9 v+ q8 g  i8 z& O* T* O5 u
  16.                 "-I",/ D$ I# \% n6 Q" X
  17.                 "main/inc/",1 F/ \) J6 d# z0 }; X
  18.                 "-I",7 d, f) i1 d, u# G
  19.                 "hello1/inc/",
    6 h9 ~9 F$ ]% T# o: h& N! N, I
  20.                 "-I",
    0 t" z$ A4 w1 n1 ^$ c
  21.                 "hello2/inc/",6 r% y3 ^- Y3 x- `8 `& A- S& z8 G
  22.             ],
    ' h' m; I$ L& ?4 u9 M$ _, c8 Y
  23.             "group": {
    7 ?/ L+ \2 b- v# K6 d! B# c7 @
  24.                 "kind": "build",
      L( F  f5 z  L$ }* F
  25.                 "isDefault": true
    0 b# _- `+ e, J7 b
  26.             }! t9 n" h. i) D' b( b1 d
  27.         }# ^, W+ I+ q2 Q2 N
  28.     ]
    7 b: O# O7 n5 y! H, _; j
  29. }
复制代码

7 N- c) [( H2 F3 F% k; d3 i) \
当程序文件很多架构大时同样需要配合Makefile使用,仍使用前文的例子修改tasks.json中的command如下:

  1. - s$ O% X, N8 r$ e; I4 I. M& s. F
  2. {1 G% c8 D" j; `( E+ M5 w  V! h  ^
  3.     // See http://go.microsoft.com/fwlink/?LinkId=733558! n5 y; |9 i9 D( R
  4.     // for the documentation about the tasks.json format
    2 z/ m: M$ z! \7 Q9 [, w# c
  5.     "version": "2.0.0",
    2 a4 `; H3 ~( R- Q# N; l
  6.     "tasks": [) Q4 Y$ q& Q6 f% v/ c
  7.         {7 S- p* Z* O  Z+ D  D  W! r6 n' @
  8.             "label": "Build",
    5 W2 j; g4 Q' T, o, k
  9.             "type": "shell",8 S3 J6 h2 m8 J, P
  10.             "command": "make",2 |# V, Q: P4 Q( Y2 R+ r
  11.         }
    9 s0 U! @: A, e/ n$ [) s7 w
  12.     ]
    1 w# G) Q3 N$ r* o: D
  13. }
复制代码

5 C7 C9 j/ c, {
注意:launch.json文件中
"${workspaceFolder}/${fileBasenameNoExtension}.exe",//可执行文件的路径和文件名称要和Makefile生成的.exe路径一样。
( N. I( ~, ~% M2 t1 I$ w4 z  U
赞 收藏 1 评论3 发布时间:2020-6-3 21:06

举报

3个回答
xiaonihao444-20 回答时间:2020-6-3 22:13:48
学习了
radio2radio 回答时间:2020-6-3 23:03:02
为什么编译器不是 gcc-arm-none-eabi ?毕竟我们都是STM32 MCU.
李康1202 回答时间:2020-6-4 08:55:36
谢谢分享
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版