快速在VSCode中创建多文件多目录C++项目

对于轻量级的VSCode编辑器,我想像使用那些IDE一样,通过简单的几步就能构建出自己的项目文件树,类似于下面的结构。所以特地写了一个脚本,用于自动创建一个基本的项目。

.
├── Headers
│   └── test.hpp
├── makefile
├── Output
│   └── bin
└── Sources
    ├── main.cpp
    └── test.cpp
1
2
3
4
5
6
7
8
9
1
2
3
4
5
6
7
8
9
下面直接提供脚本:

### new.sh

# 输入一个文件名 $projectname
read projectname

# 添加前缀
filename="VSC_CPP_"$projectname

# 源文件目录
Src="$filename/Sources"

# 头文件目录
Inc="$filename/Headers"

# 创建项目树
mkdir -p $Src $Inc $filename/Output/bin

# 创建makefile文件
touch $filename/makefile

# 创建 main.cpp文件
touch $Src/main.cpp

# 文件名小写转换
#declare -l lfilename=$projectname
lfilename="${projectname,,}"

# 源文件
cpp_file=$Src"/"${lfilename}".cpp"
# 头文件
hpp_file=$Inc"/"${lfilename}".hpp"

# 创建一对项目文件
touch $cpp_file $hpp_file

# 向main.cpp中写入内容
echo "#include <iostream> " >> $Src/main.cpp
echo "#include \"$lfilename.hpp\"" >> $Src/main.cpp
echo "" >> $Src/main.cpp
echo "using namespace std;" >> $Src/main.cpp
echo "" >> $Src/main.cpp
echo "int main()" >> $Src/main.cpp
echo "{" >> $Src/main.cpp
echo "    cout << \"Hello VSC\" << endl;" >> $Src/main.cpp
echo "    return 0;" >> $Src/main.cpp
echo "}" >> $Src/main.cpp

# 向*.hpp中写入内容
echo "#pragma once" >> $Inc/$lfilename.hpp
echo "#include <iostream>" >> $Inc/$lfilename.hpp
echo "using namespace std;" >> $Inc/$lfilename.hpp
echo "" >> $Inc/$lfilename.hpp
echo "class $projectname" >> $Inc/$lfilename.hpp
echo "{" >> $Inc/$lfilename.hpp
echo "public:" >> $Inc/$lfilename.hpp
echo "    $projectname();" >> $Inc/$lfilename.hpp
echo "    $projectname($projectname &&) = default;" >> $Inc/$lfilename.hpp
echo "    $projectname(const $projectname &) = default;" >> $Inc/$lfilename.hpp
echo "    $projectname &operator=($projectname &&) = default;" >> $Inc/$lfilename.hpp
echo "    $projectname &operator=(const $projectname &) = default;" >> $Inc/$lfilename.hpp
echo "    ~$projectname();" >> $Inc/$lfilename.hpp
echo "" >> $Inc/$lfilename.hpp
echo "protected:" >> $Inc/$lfilename.hpp
echo "" >> $Inc/$lfilename.hpp
echo "private:" >> $Inc/$lfilename.hpp
echo "" >> $Inc/$lfilename.hpp
echo "};" >> $Inc/$lfilename.hpp

# 向*.cpp中写入内容
echo "#include \"$lfilename.hpp\"" >> $Src/$lfilename.cpp
echo "" >> $Src/$lfilename.cpp
echo "$projectname::$projectname()" >> $Src/$lfilename.cpp
echo "{" >> $Src/$lfilename.cpp
echo "}" >> $Src/$lfilename.cpp
echo "" >> $Src/$lfilename.cpp
echo "$projectname::~$projectname()" >> $Src/$lfilename.cpp
echo "{" >> $Src/$lfilename.cpp
echo "}" >> $Src/$lfilename.cpp

# 导入makefile
# cat "./makefile" >> $filename/makefile
echo "# 描述: C++ 项目 makefile文件" >> $filename/makefile
echo "# 版本: v3.0" >> $filename/makefile
echo "# 修改记录:  1.先测试普通的cpp文件的编译运行" >> $filename/makefile
echo "#            2.使用变量来改进我们的makefile文件" >> $filename/makefile
echo "#            3.新加了一个源文件" >> $filename/makefile
echo "#            4.使用伪目标,加上clean规则" >> $filename/makefile
echo "#            5.使用wildcard函数,自动扫描当前目录下的源文件" >> $filename/makefile
echo "#            6.加入了自动规则依赖" >> $filename/makefile
echo "#            7.改变依赖关系的生成模式" >> $filename/makefile
echo "#            8.提供多目录文件编译" >> $filename/makefile
echo "" >> $filename/makefile
echo "# 头文件存放目录" >> $filename/makefile
echo "INC_DIR=./Headers" >> $filename/makefile
echo "" >> $filename/makefile
echo "# 可执行文件存放目录" >> $filename/makefile
echo "BIN_DIR=./Output/bin" >> $filename/makefile
echo "" >> $filename/makefile
echo "# 源文件存放目录" >> $filename/makefile
echo "SRC_DIR=./Sources" >> $filename/makefile
echo "" >> $filename/makefile
echo "# 其它中间文件存放目录" >> $filename/makefile
echo "OBJ_DIR=./Output" >> $filename/makefile
echo "" >> $filename/makefile
echo "# 源文件列表" >> $filename/makefile
echo "SRC    := \${wildcard \${SRC_DIR}/*.cpp}" >> $filename/makefile
echo "" >> $filename/makefile
echo "# obj文件列表" >> $filename/makefile
echo "OBJ    := \${patsubst %.cpp, \$(OBJ_DIR)/%.o, \${notdir \${SRC}}}" >> $filename/makefile
echo "" >> $filename/makefile
echo "# 定义编译命令变量" >> $filename/makefile
echo "CC    := g++" >> $filename/makefile
echo "rm    := rm -rf" >> $filename/makefile
echo "" >> $filename/makefile
echo "# 定义可执行文件变量" >> $filename/makefile
echo "executable    := main" >> $filename/makefile
echo "BIN_TARGET=\${BIN_DIR}/\${executable}" >> $filename/makefile
echo "" >> $filename/makefile
echo "# 终极目标规则:生成可执行文件" >> $filename/makefile
echo "\${BIN_TARGET}:\${OBJ}" >> $filename/makefile
echo "    \${CC} \${OBJ} -o \$@" >> $filename/makefile
echo "" >> $filename/makefile
echo "# 子目标规则:生成链接文件" >> $filename/makefile
echo "\${OBJ_DIR}/%.o:\${SRC_DIR}/%.cpp" >> $filename/makefile
echo "    \${CC} -o \$@ -c $< -I\${INC_DIR}" >> $filename/makefile
echo "" >> $filename/makefile
echo "#clean规则" >> $filename/makefile
echo "#.PHONY: clean" >> $filename/makefile
echo "#clean:" >> $filename/makefile
echo "#清除编译生成的所有文件" >> $filename/makefile
echo "##    \$(RM) \$(BIN_TARGET) \$(OBJ_DIR)/*.o" >> $filename/makefile
echo "#清除编译生成的所有文件,不包括可执行文件" >> $filename/makefile
echo "#    \$(RM) \$(OBJ_DIR)/*.o" >> $filename/makefile
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
现在对脚本进行简单的介绍:

首先我们需要从外部读入一个项目名称,用于创建文件夹和内部的头文件以及源文件。需要注意的时,这个文件名需要是英文,并且最好是遵守驼峰命名法,因为项目文件中的类名与这个名称一致。脚本中对项目名加前缀是为了好与其他类型的项目进行区别。
$ bash new.sh
# 在终端中输入Test作为这个项目名
Test
1
2
3
创建项目树。创建Headers文件夹用于存放头文件,创建Sources文件夹用于存放源文件,创建Output文件用于存放可执行文件以及中间文件,可执行文件存放在Output的子文件夹bin中。

创建文件。main.cpp, test.cpp, test.hpp, makefile。其中test.hpp和test.cpp是根据读入的项目名创建的两个文件,文件名都经过了小写转换。

向文件中写入基本的内容。这里是通过echo的重定向操作实现写入。以下是具体的写入内容。

// main.cpp
#include <iostream> 
#include "test.hpp"

using namespace std;

int main()
{
    cout << "Hello VSC" << endl;
    return 0;
}

1
2
3
4
5
6
7
8
9
10
11
12
1
2
3
4
5
6
7
8
9
10
11
12
// test.hpp
#pragma once
#include <iostream>
using namespace std;

class Test
{
public:
    Test();
    Test(Test &&) = default;
    Test(const Test &) = default;
    Test &operator=(Test &&) = default;
    Test &operator=(const Test &) = default;
    ~Test();

protected:

private:

};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// test.cpp
#include "test.hpp"

Test::Test()
{
}

Test::~Test()
{
}

1
2
3
4
5
6
7
8
9
10
11
1
2
3
4
5
6
7
8
9
10
11
# makefile
# 描述: C++ 项目 makefile文件
# 版本: v3.0
# 修改记录:  1.先测试普通的cpp文件的编译运行
#            2.使用变量来改进我们的makefile文件
#            3.新加了一个源文件
#            4.使用伪目标,加上clean规则
#            5.使用wildcard函数,自动扫描当前目录下的源文件
#            6.加入了自动规则依赖
#            7.改变依赖关系的生成模式
#            8.提供多目录文件编译

# 头文件存放目录
INC_DIR=./Headers

# 可执行文件存放目录
BIN_DIR=./Output/bin

# 源文件存放目录
SRC_DIR=./Sources

# 其它中间文件存放目录
OBJ_DIR=./Output

# 源文件列表
SRC    := ${wildcard ${SRC_DIR}/*.cpp}

# obj文件列表
OBJ    := ${patsubst %.cpp, $(OBJ_DIR)/%.o, ${notdir ${SRC}}}

# 定义编译命令变量
CC    := g++
rm    := rm -rf

# 定义可执行文件变量
executable    := main
BIN_TARGET=${BIN_DIR}/${executable}

# 终极目标规则:生成可执行文件
${BIN_TARGET}:${OBJ}
    ${CC} ${OBJ} -o $@

# 子目标规则:生成链接文件
${OBJ_DIR}/%.o:${SRC_DIR}/%.cpp
    ${CC} -o $@ -c $< -I${INC_DIR}

#clean规则
#.PHONY: clean
#clean:
#清除编译生成的所有文件
##    $(RM) $(BIN_TARGET) $(OBJ_DIR)/*.o
#清除编译生成的所有文件,不包括可执行文件
#    $(RM) $(OBJ_DIR)/*.o

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
这样一个基本的项目就创建完成了。那么应该在VS Code怎么使用呢?
在这里默认大家对在Linux环境下VS Code开发C++有一定的了解了。如果不了解的话,可以参考本人的相关博客。

首先,我们需要对coder-runner插件的配置文件进行部分的改动。

在User Settings 中搜索 code-runner.executorMap对C++项目文件的执行命令进行更改。
更改如下:
"cpp": "cd $dir && cd .. && make && cd ./Output/bin && ./main && cd ../../"
解释一下,$dir是我们在VS Code 中当前打开的文件目录,一般是头文件和源文件(如果是makefile文件,那么运行这个插件是没有用的),首先会打开这个目录,然后回退到有makefile文件的文件目录中,然后 进行make,我们使用VS Code 并不仅仅是为了生成可执行文件,还需要看到运行结果,所以还需要浏览到可执行文件所在的文件夹中,运行可执行文件,在makefile中默认可执行文件名是main,执行完到这里后,我是让终端的当前目录回到最初的目录。

最后运行产生的项目文件树:

.
├── Headers
│   └── test.hpp
├── makefile
├── Output
│   ├── bin
│   │   └── main
│   ├── main.o
│   └── test.o
└── Sources
    ├── main.cpp
    └── test.cpp
--------------------- 
作者:码上看世界 
来源:CSDN 
原文:https://blog.csdn.net/qq_34347375/article/details/82958488 
版权声明:本文为博主原创文章,转载请附上博文链接!

转载于:https://my.oschina.net/u/4000302/blog/3024331

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值