快速在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  版權聲明:本文爲博主原創文章,轉載請附上博文連接!

相關文章
相關標籤/搜索