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

对于轻量级的VSCode编辑器,我想像使用那些IDE同样,经过简单的几步就能构建出本身的项目文件树,相似于下面的结构。因此特意写了一个脚本,用于自动建立一个基本的项目。ios

.
├── 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
下面直接提供脚本:bash

### new.sh编辑器

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

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

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

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

# 建立项目树
mkdir -p $Src $Inc $filename/Output/bin插件

# 建立makefile文件
touch $filename/makefilecode

# 建立 main.cpp文件
touch $Src/main.cppblog

# 文件名小写转换
#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  版权声明:本文为博主原创文章,转载请附上博文连接!

相关文章
相关标签/搜索