记录下搭建过程,方便以后查看。

操作系统:WIN10(64-bit)

vscode 版本: 1.63.2

GCC 版本: gcc version 10.3.0 (Rev8, Built by MSYS2 project)

首先安装3款要使用的工具VSCode, MSYS2和GIT,安装方法简单,不再细说。其中,

(1)VSCode——主要用来编辑代码,其次VSCode提供了一些应用接口,这些应用接口帮助我们调用外部的应用,如gcc.exe, gdb.exe, mingw32-make.exe和bash.exe,为我们节省了不断切换窗口带来的开销。

(2) MSYS2——一个兼容Windows的小型GNU/Linux环境。

(3)GIT(git-for-windows)——提供了bash终端,方便我们解析shell指令(make, gcc等等)。

在上述3个工具的安装过程中,如果遇到了要添加系统环境变量的请求,请确认添加。

此外,VSCode安装完成后,启动VSCode并安装C/C++插件,方便阅读C/C++代码。利用MSYS2中的pacman安装MinGW64,具体按方法如下: MSYS2https://www.msys2.org/为了验证gcc、make是否成功,可在PowerShell窗口中输入gcc -v,若成功其效果如下:

PS E:\> gcc -v
Using built-in specs.
COLLECT_GCC=D:\Program Files\msys64\mingw64\bin\gcc.exe
COLLECT_LTO_WRAPPER=D:/Program\ Files/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.3.0/lto-wrapper.exe
Target: x86_64-w64-mingw32
Configured with: ../gcc-10.3.0/configure --prefix=/mingw64 --with-local-prefix=/mingw64/local --build=x86_64-w64-mingw32 --host=x86_64-w64-mingw32 --target=x86_64-w64-mingw32 --with-native-system-header-dir=/mingw64/x86_64-w64-mingw32/include --libexecdir=/mingw64/lib --enable-bootstrap --enable-checking=release --with-arch=x86-64 --with-tune=generic --enable-languages=c,lto,c++,fortran,ada,objc,obj-c++,jit --enable-shared --enable-static --enable-libatomic --enable-threads=posix --enable-graphite --enable-fully-dynamic-string --enable-libstdcxx-filesystem-ts=yes --enable-libstdcxx-time=yes --disable-libstdcxx-pch --disable-libstdcxx-debug --enable-lto --enable-libgomp --disable-multilib --disable-rpath --disable-win32-registry --disable-nls --disable-werror --disable-symvers --with-libiconv --with-system-zlib --with-gmp=/mingw64 --with-mpfr=/mingw64 --with-mpc=/mingw64 --with-isl=/mingw64 --with-pkgversion='Rev8, Built by MSYS2 project' --with-bugurl=https://github.com/msys2/MINGW-packages/issues --with-gnu-as --with-gnu-ld --with-boot-ldflags='-pipe -Wl,--dynamicbase,--high-entropy-va,--nxcompat,--default-image-base-high -Wl,--disable-dynamicbase -static-libstdc++ -static-libgcc' 'LDFLAGS_FOR_TARGET=-pipe -Wl,--dynamicbase,--high-entropy-va,--nxcompat,--default-image-base-high' --enable-linker-plugin-flags='LDFLAGS=-static-libstdc++\ -static-libgcc\ -pipe\ -Wl,--dynamicbase,--high-entropy-va,--nxcompat,--default-image-base-high\ -Wl,--stack,12582912'
Thread model: posix
Supported LTO compression algorithms: zlib zstd
gcc version 10.3.0 (Rev8, Built by MSYS2 project)

输入make -v,若成功其效果如下:

PS E:\> make -v
GNU Make 4.3
Built for Windows32
Copyright (C) 1988-2020 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

准备工作已经完成,接下来开始搭建工程目录,目录结构如下:

00_ProjectSelfTest
│  Makefile

├─.vscode
├─101_UnitTest
│  │  Makefile
│  │
│  └─src
│      │  UnitTest.c
│      │
│      └─obj
│              UnitTest.o

├─10_Main
│  │  includes.h
│  │
│  └─00_01
│          test.txt

├─98_BufCtrl
│  │  Makefile
│  │
│  ├─inc
│  │      BufCtrl.h
│  │      BufCtrlDef.h
│  │
│  └─src
│      │  BufCtrl.c
│      │
│      └─obj
│              BufCtrl.o

├─99_LogPrint
│  │  Makefile
│  │
│  ├─inc
│  │      LogPrint.h
│  │      LogPrintDef.h
│  │
│  └─src
│      │  LogPrint.c
│      │
│      └─obj
│              LogPrint.o

├─lib
│      BufCtrl.a
│      LogPrint.a

└─target
        UnitTest_main.exe

工程的根目录是00_ProjectSelfTest,顶级Makefile在根目录下。

.vscode文件夹是VScode创建的。在VScode中选择 文件->打开文件夹 后,就会在相应的文件夹下新建一个.vscode文件夹,在本例中打开的文件夹就是00_ProjectSelfTest。

10_Main, 98_BufContrl, 99_LogPrint和101_UnitTest这4个文件夹是按照功能命名的,各自都包含了1个Makefile文件。inc文件夹里存放着头文件,src文件夹里存放源文件,src/obj文件夹里存放着目标文件。

lib文件夹存放着库文件。

target文件夹存放着可执行文件。

101_UnitTest和10_Main是一个级别的,他们会调用98_BufContrl和99_LogPrint中的函数,因此101_UnitTest和10_Main的Makefile是类似的,98_BufContrl和99_LogPrint的Makefile是类似的。

顶级Makefile内容如下:

#最外层的makefile负责创建相关目录和进入每个子目录去make#后边里目录要根据前面一个的目录为基准
SUBDIRS = ./98_BufCtrl ../99_LogPrint ../101_UnitTest
.PHONY:all
all:mkdir -p ./targetmkdir -p ./98_BufCtrl/src/objmkdir -p ./99_LogPrint/src/objmkdir -p ./101_UnitTest/src/obj@list='$(SUBDIRS)';for subdir in $$list; do \cd $$subdir && make; \done.PHONY:clean
clean:@list='$(SUBDIRS)'; for subdir in $$list; do \echo "Clean in $$subdir";\cd $$subdir && make clean;\donerm -rf ./target

101_UnitTest中的Makefile内容如下:

CC := gcc
CFLAGS := -fPICINC_DIR := -I../10_Main -I../98_BufCtrl/inc -I../99_LogPrint/inc
SRC_DIR := ./src
OBJ_DIR := $(SRC_DIR)/objTARGET_DIR := ../target
TARGET := UnitTest_main
INSTALL_LIB_PATH := ../lib#包含所有以.a结尾的文件
LIB_TARGET := *.aCFLAGS += $(INC_DIR)SOURCE = $(wildcard $(SRC_DIR)/*.c)
SOURCER = $(notdir $(SOURCE))
OBJS = $(patsubst %.c,%.o,$(SOURCER))
OBJS := $(foreach X,$(OBJS),$(OBJ_DIR)/$(X))$(OBJ_DIR)/%.o: $(SRC_DIR)/%.c$(CC) $(CFLAGS) -c -g -Wall -o $@ $<#生成可执行文件
$(TARGET):$(OBJS)$(CC) -o $(TARGET_DIR)/$(TARGET) $(OBJS) \$(INSTALL_LIB_PATH)/$(LIB_TARGET)@echo "------------------------ MAKEFILE COMPLETE -----------------------".PHONY:clean
clean:rm -rf $(OBJ_DIR)

98_BufContrl中的Makefile内容如下:

CC := gccINC_DIR := -I../10_Main -I./inc
SRC_DIR := ./src
OBJ_DIR := $(SRC_DIR)/objINSTALL_LIB_PATH := ../lib
LIB_TARGET := BufCtrl.a#包含需要的头文件路径
CFLAGS += $(INC_DIR)#搜索指定目录下的所有以.c结尾的文件(搜索结果保存在SOURCE,结果中包含路径相关信息)
SOURCE = $(wildcard $(SRC_DIR)/*.c)
#去除结果中的路径信息
SOURCER = $(notdir $(SOURCE))
#把.c换成.o
OBJS = $(patsubst %.c,%.o,$(SOURCER))#把所有.o加上想要的路径信息
OBJS := $(foreach X,$(OBJS),$(OBJ_DIR)/$(X))
#OBJS := $(OBJ_DIR)/*.o
#OBJS := $(OBJ_DIR)/a.o \
#   $(OBJ_DIR)/main.o
#OBJS := $(foreach x,$(OBJS),$(x).o)
$(OBJ_DIR)/%.o: $(SRC_DIR)/%.c$(CC) $(CFLAGS) -c  -g -Wall -o $@ $<#$(TARGET):$(OBJS)
#   $(CC) $(CFLAGS) -o $(TARGET_DIR)/$@ $(OBJS)
#用.o生成静态库文件.a,并放到指定目录下
$(LIB_TARGET):$(OBJS)ar crus $(LIB_TARGET) $^install -m 0755 $(LIB_TARGET) $(INSTALL_LIB_PATH)rm -rf $(LIB_TARGET).PHONY:clean
clean:rm -rf $(OBJ_DIR)rm -rf $(INSTALL_LIB_PATH)/$(LIB_TARGET)

相应的Makefile编写完成后,尝试编译下工程。启动GIT Bash, 然后输入make:

Op@Op MINGW64 /e/00_ProjectSelfTest (LocalDevlop)
$ make
mkdir -p ./target
mkdir -p ./98_BufCtrl/src/obj
mkdir -p ./99_LogPrint/src/obj
mkdir -p ./101_UnitTest/src/obj
make[1]: Entering directory 'E:/00_ProjectSelfTest/98_BufCtrl'
ar crus BufCtrl.a src/obj/BufCtrl.o
ar: `u' modifier ignored since `D' is the default (see `U')
install -m 0755 BufCtrl.a ../lib
rm -rf BufCtrl.a
make[1]: Leaving directory 'E:/00_ProjectSelfTest/98_BufCtrl'
make[1]: Entering directory 'E:/00_ProjectSelfTest/99_LogPrint'
ar crus LogPrint.a src/obj/LogPrint.o
ar: `u' modifier ignored since `D' is the default (see `U')
install -m 0755 LogPrint.a ../lib
rm -rf LogPrint.a
make[1]: Leaving directory 'E:/00_ProjectSelfTest/99_LogPrint'
make[1]: Entering directory 'E:/00_ProjectSelfTest/101_UnitTest'
gcc -o ../target/UnitTest_main ./src/obj/UnitTest.o \
../lib/*.a
------------------------ MAKEFILE COMPLETE -----------------------
make[1]: Leaving directory 'E:/00_ProjectSelfTest/101_UnitTest'

很好,编译成功!

毕竟不是在IDE中工作,编译和编辑分开稍微感觉有些麻烦,把git-bash终端集成到VSCode中是个不错的选择,将如下代码添加到.vscode/settings.json末尾即可。在VSCode的终端下拉菜单里就有bash终端了。

    "terminal.integrated.profiles.windows": {"PowerShell": {"source": "PowerShell","icon": "terminal-powershell"},"Command Prompt": {"path": ["${env:windir}\\Sysnative\\cmd.exe","${env:windir}\\System32\\cmd.exe"],"args": [],"icon": "terminal-cmd"},"GitBash": {"path":["D:\\Program Files\\Git\\bin\\bash.exe"],"icon": "terminal-bash","args": []}},"terminal.integrated.defaultProfile.windows": "GitBash"

进一步调试代码可以参考VSCode的官方教程。所需的工具我们已经具备了,只需要按照说明执行即可。

Get Started with C++ and Mingw-w64 in Visual Studio Codehttps://code.visualstudio.com/docs/cpp/config-mingw

【1】目录和makefile编写的参考文章:

多级目录makefile例子_G_Caesar_的博客-CSDN博客_makefile多级目录

【2】VSCode中添加GIT-BASH的参考文章:解决Vscode GitBash失效的问题Value is not accepted_winter tree的博客-CSDN博客

遗留问题:

1. MSYS2中的bash(位于usr/bin 中)和git-bash有什么区别?git-bash支持ls, make等命令,而MSYS2中的bash却不支持这些命令,且启动时表现得很奇怪:有时候启动特别慢,甚至需要双击好几次。有时候启动了,整个窗口只有一个光标在闪烁,没有任何其他的提示。

VSCODE+MSYS2+GIT BASH+MAKEFILE 建立工程相关推荐

  1. Git使用总结(包含Git Bash和Git GUI的使用)

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/KevinDGK/article/details/51606925 目录(?)[+] Git总结 简介 ...

  2. buntu linux下建立stm32开发环境: GCC安装以及工程Makefile建立

    之前在e络盟的意法半导体掏了一个STM32开发板挺好的,却不想在window下开发,也不想用那么占内存的IAR MDK等软件,所以决定在ubuntu下建立该开发环境,像之前avr linux一样,找了 ...

  3. VScode终端配置bash.git(默认),terminal.integrated.shell:windows路径查找不到前提下

    问题: VScode升级到1.60.05版本后,终端配置不支持"terminal.integrated.shell.windows",想要在VScode终端将bash设置为默认终端 ...

  4. 使用git将本地项目工程推送到码云上

    1.在本地使用Intellj IDEA构建项目工程,整个项目工程结构如下图所示: 2.在工程根目录下面,使用git Bash打开git客户端: 3.使用git init初始化项目,此时会在工程根目录下 ...

  5. 哔哩哔哩千峰教育Git教程笔记(安装、分支、协作、冲突、GitHub、gitee、vscode集成git)

    Git 介绍 Git和SVN的区别 Git安装 Git初始化 设置用户签名 初始化本地库 Git工作机制 添加暂存区 vim编辑器 git add添加到暂存区 git status查看状态 git c ...

  6. git服务器的建立——Git折腾小记

    这两天刚完成了一个小项目,整理资料发现现在写代码跟文档又没有版本控制的意识,刚好前两天电脑出问题,差点所有代码跟文档全丢掉,所以这两天又在自己的台式机上架起了git,做所谓的代码服务器,之前折腾过一次 ...

  7. 常用Git指令|初入职Git指令学习|如何将Git项目拉至本地|如何将本地项目上传至Git|Ubuntu下Git环境配置|Ubuntu下如何利用VSCode使用Git指令

    实习入职已经一个月了,整理一下自己常用的一些指令,供自己查阅,也可以供一些新入职朋友参考. 这条博客也会不定时更新. 2022.10.26更新Ubuntu环境下的Git配置,因为最近可能需要win,U ...

  8. Git Manual / Git使用手册 / Git, GitLab, Git Bash, TortoiseGit (建议全文复制到Word文档中通过导航窗格查看)...

    Git使用手册 目录 1     引言 2     Git.GitLab简介 2.1      Git 2.2      GitLab 2.3      Git基本概念 3     运行环境 4    ...

  9. 详细介绍如何在win7下首次实现通过Git bash向Github提交项目

    详细介绍如何在win7下首次实现通过Git bash向Github提交项目 引自:http://jingpin.jikexueyuan.com/article/35944.html 作者: wddoe ...

最新文章

  1. Android ScrollView 滑动指定的距离
  2. 数据库的这些性能优化,你做了吗?
  3. Radio Button的使用
  4. asp.net DBHelper类
  5. 雷达篇(九)雷达中的“快采样”和“慢采样”
  6. JavaFX技巧17:带有AnchorPane的动画工作台布局
  7. jquery实时监听输入框值变化
  8. 前端学习(3088):vue+element今日头条管理-关于接口的使用(有声版)
  9. python如何用色度表示数值大小_python中色度通道的YUV子采样
  10. Java Web架构演变
  11. GitHub添加SSH-key的步骤
  12. ChartControl控件绘制柱状图
  13. 安装 3dsMax 2020 there is problem 错误
  14. 西瓜书学习笔记第2章(模型评估与选择)
  15. 高防IP防护效果怎么样?甜甜告诉您
  16. 关于开发微信公众号获取手机用户运动数据的功能实现思路
  17. 半导体物理 第七章 金属半导体接触及其能级图
  18. xml文档规则_避免文档陷阱的7条规则
  19. 童年的回忆小游戏来了——贪吃蛇,快来自己动手写一个属于自己的小游戏吧
  20. 谷粒学院day0day1——项目介绍与mybatis plus入门

热门文章

  1. 如何为前端项目一键自动添加eslint和prettier的支持
  2. 杂学Linux-基础篇
  3. Java的简单数据类型,及输出特殊偏旁的汉字
  4. ubuntu 14.04 截屏快捷键
  5. 瑞昱8822BE网卡问题记录
  6. 牛市来了?这几款开源项目让你的交易更加得心应手
  7. 抖音短视频快速创作,抖音怎么剪辑不算搬运
  8. windows桌面应用_现代Windows 8应用与Windows桌面应用不同的7种方式
  9. 第四章 使用嵌入式 Python(一)
  10. 使用ComplexHeatmap绘制复杂热图|Note2:单个热图(万字超详细教程)