文章框架
前言
LOX(Lightweight Open-source Xplatform)是我正在編寫的一個全新文集,意思就如其名:輕量級-開源-跨平臺。就是這個系列中的文章和例程都符合輕量級(Lightweight)、開源(Open-Source)、跨平臺(Cross-Platform)。嗯,我這人吧,就好起一些新的名詞。
本篇作為LOX系列的第一篇,也向你展示了一個最簡單的LOX項目。如果想看一個稍微復雜一點的LOX項目,可以clone我Github上的一個Repo:2048 CLI。歡迎來搞~
單源文件
先從簡單的來,一個源文件。
工具
進行本次LOX開發所需要工具,點擊下面的Title進入官網下載。
VSCode是微軟出品的一款非常良心的輕量級編輯器,雖說是完全照著Sublime Text弄出來的,但它免費啊,還開源啊,所以我也就不深究模仿不模仿了。(嗨呀,原則呢?嗯?)
需要的插件
插件 | 標識符 | 說明 |
---|---|---|
C/C++ | ms-vscode.cpptools | C/C++語言支持,簡單的編輯、編譯、調試等功能。 |
這個工具是在Windows上需要的。因為Windows沒有GNU工具包,MinGW就是為Windows而生的GNU工具包。
需要安裝的包
包 | 說明 |
---|---|
mingw32-gcc.bin | GNU C編譯器 |
mingw32-gcc-g++.bin | GNU C++編譯器 |
mingw32-gdb.bin | GNU 調試器 |
環境變量
在系統變量的PATH
中,添加MinGW安裝的根目錄中的bin文件夾(如C:\MinGW\bin
),且盡量將這一項往上移(為了優先搜索該目錄)。
完成這一步后,如果打開了VSCode,記得要重啟VSCode。
編碼
建立工作空間
新建一個文件夾 - 右鍵 - Open with Code。使用這種方法的前提是你在安裝VSCode時選中了“”
或者在VSCode中 - 文件 - 打開文件夾,選中一個空文件夾作工作空間。
新建源文件
鼠標移動到新建的文件夾的根目錄處(我的是“HelloWorld”),點擊下圖藍色框住的圖標(新建文件)。
之后在其中輸入文件名(包括后綴名),本例的后綴名寫".c"或".cpp"。然后在其中寫個最簡單的HelloWorld。
代碼
#include <stdio.h>
int main(){
printf("Hello World");
return 0;
}
編碼時,如果想自動補全,需要在包含指定頭文件后保存代碼,然后才會啟動自動補全。
也就是說,它只對保存后的代碼進行探測。
生成
生成快捷鍵:Ctrl(Mac: Command)+Shift+B
第一次生成時,VSCode會提示找不到生成的配置文件task.json
,點擊“配置生成任務”。
在給出的模板中選擇
Others
。在打開的task.json
中改為下述代碼。
{
"version": "0.1.0",
"command": "gcc",
"isShellCommand": true, // 是否為Shell命令
"args": ["-g","${file}","-o","${fileDirname}/${fileBasenameNoExtension}.out"],
"showOutput": "always"
}
其實作用就是代碼中所述的。
"command": "gcc"
和"args": ["-g","${file}","-o","${fileDirname}/${fileBasenameNoExtension}.out"]
就相當于在Shell中直接鍵入gcc -c 源文件.c -o 源文件所在目錄/源文件.out
。將鼠標放在Key(冒號前面的)上會顯示所對應的意思(下面的Launch.json同)。
簡單的解釋一下其中幾個$
標識
標識 | 作用 |
---|---|
${file} |
當前文件的完整文件名(包括路徑、文件名、后綴名) |
${fileDirname} |
當前文件的路徑 |
${fileBasenameNoExtension} |
當前文件的文件名(不包括路徑、后綴名) |
其中所說的“當前文件”指的是你在VSCode編輯器中打開的并正在編輯的文件。
完成task.json
的配置后,我們縮寫的程序已經可以運行了。生成的程序就是源文件所在根目錄中出現的與源文件同名但后綴名為.out
的文件。
調試
我們當然不能僅僅滿足于生成出程序就行的,大部分情況我們是要調試的。
調試快捷鍵:F5
第一次按F5
時和生成時一樣,找不到配置文件,在打開的模板中選C++ (GDB/LLDB)
(可以跨平臺)。
生成的配置文件為launch.json
將launch.json
改為下述代碼
{
"version": "0.2.0",
"configurations": [
{
"name": "(gdb) Launch", // 本配置的名稱,隨便起
"type": "cppdbg",
"request": "launch", // 如果調試的類型為附加進程,需將這里改為attach
"program": "${fileDirname}/${fileBasenameNoExtension}.out", // 要調試的程序路徑
"stopAtEntry": false, // 是否在起點處停頓
"cwd": "${workspaceRoot}",
"externalConsole": true, // 在外部控制臺運行。若為false,則運行在VSCode自帶的控制臺中
"linux": { // Linux 系統下的配置
"MIMode": "gdb"
},
"osx": { // OS X系統下的配置
"MIMode": "lldb"
},
"windows": { // Windows 系統下的配置
"MIMode": "gdb",
"miDebuggerPath": "gdb.exe"
}
}
]
}
Windows默認是沒有gdb或lldb的,所以我們需要安裝MinGW中的gdb,并在這里設置gdb的路徑。只寫程序名是因為設置了環境變量。
完成launch.json
的配置并切換到源代碼編輯頁之后
再一次:F5
多源文件
什么!你不滿足于單源文件開發?!來來來,我給你看個寶貝。
的確,單源文件開發一般也就是個做做算法題,現在隨便寫個像樣的工程都是多個源文件編譯鏈接一條龍的。這樣VSCode可以嗎,也可以!但需要新的幫手:CMake。
工具
新需要的插件
實際上通過CMake在VSCode上進行項目開發可以不需要任何插件,但是用上這些插件之后你會發現這個過程會變得特別方便!
除去單源文件中所提到的cpptools
,還需要下面的插件。
插件 | 標識符 | 說明 |
---|---|---|
CMake | twxs.cmake | 提供CMake語法支持,包括高亮和自動補全等 |
CMake Tools | vector-of-bool.cmake-tools | 這個屌!完全把CMake封裝成一套VSCode底邊欄的工具集 |
同樣這一步僅在Windows上做。
需要新安裝的包
包 | 說明 |
---|---|
mingw32-make.bin | GNU Make,根據makefiles(在這里makefiles由CMake搞定)生成項目 |
為了方便調用,我一般會把mingw32-make.exe
在其目錄中復制一份出來,命名為make.exe
。
這一步某種程度意義上講還蠻重要的,第一是方便自己調用(直接在shell里make
),第二是方便vscode的插件調用(如果不弄一個cmake.exe
出來的話,vector-of-bool.cmake-tools
會報錯,不過具體鍋是vector-of-bool.cmake-tools
還是twxs.cmake
的也不太清楚,目前vector-of-bool已經把這個問題(#157
)標記為bug
,并打算在0.10.0
版本解決。)。
安裝時記得將Add CMake to system PATH
勾上。是for all users
呢還是for current user
你自己看咯。
編碼
上個例子是C,那這個就上C++好了。
目錄結構
我就不同目錄下多文件了啊,那沒啥意思。咱上多層級目錄多源文件的。
代碼
Printer.h
#pragma once
class Printer{
public:
void print();
Printer();
~Printer();
};
Printer.cpp
#include "Printer.h"
#include <iostream>
using namespace std;
void Printer::print(){
cout<<"Hello World"<<endl;
}
Printer::Printer() {
cout<<"Printer Object Constructed"<<endl;
}
Printer::~Printer(){
cout<<"Printer Object Destructed"<<endl;
}
- 'main.cpp'
#include "Lib/Printer.h"
int main(){
Printer* printer = new Printer();
printer->print();
delete printer;
return 0;
}
生成項目
編寫CMakeLists
每一個包含源文件的目錄中都要編寫CMakeLists.txt
-
CMakeLists.txt
根目錄中的CMakeLists.txt
,一般程序入口(main
函數)在此。
# 使用CMake Tools插件(可選,如果這個項目去到一個沒有這個插件的機器也同樣可以生成項目)
include(CMakeToolsHelpers OPTIONAL)
# CMake 最低版本號要求
cmake_minimum_required(VERSION 2.8)
# 項目名稱
project(CMakeTest)
# 查找當前目錄下的所有源文件
# 并將名稱保存到 DIR_ROOT_SRCS變量
aux_source_directory(. DIR_ROOT_SRCS)
# 添加 Lib子目錄
add_subdirectory(Lib)
# 指定生成目標
add_executable(CMakeTest main.cpp ${DIR_ROOT_SRCS})
# 添加鏈接庫
target_link_libraries(CMakeTest PrinterLib)
-
Lib/CMakeLists.txt
子目錄中的CMakeLists.txt
,一般將子目錄中的源文件編譯為靜態鏈接庫。
include(CMakeToolsHelpers OPTIONAL)
cmake_minimum_required(VERSION 2.8)
aux_source_directory(. DIR_LIB_SRCS)
# 生成鏈接庫
add_library(PrinterLib ${DIR_LIB_SRCS})
Build
完成上面步驟后,就可以Build了,如果你安裝了vector-of-bool.cmake-tools
插件,VSCode左下角的底邊欄會有Build
按鈕。
點擊
Build
后,選擇Debug
(為了下一步演示調試,若不調試就Release
)輸出框會不停往出噴東西,只要最后輸出了
[vscode] cmake exited with return code 0
,就說明Build成功。目錄結構
新增加的build文件夾是
vector-of-bool.cmake-tools
插件干的,它做的很好,如果我們手動cmake - make
,那些生成文件會跑的到處都是。其中
build/CMakeTests.exe
就是我們生成的可執行程序。
調試
調試設置
文件
- 首選項
- 設置
在CMake Tools configuration
中找到cmake.debugConfig
,生成設置:
"cmake.debugConfig": {
"miDebuggerPath": "gdb.exe", // Windows 下指定gdb路徑(已添加到PATH)
"externalConsole": true, // 使用外部控制臺
"stopAtEntry": false // 在起點處停頓(噢!在這停頓!)
},
Start Debugging
剛Build完你可能看不到這兩個按鈕:
其實他們藏起來了... 這應該是個Bug,我已經反饋給作者了。
重啟VSCode后他們就會出現,或者直接點那兩個藏起來的按鈕(還有這種操作?!):先點右邊選擇調試目標,再點左邊開始調試。
合影留念
結語
Code Everywhere, Build Everywhere.
這樣的搭配是不是很爽呢?除了MinGW是Windows特有的矯情外。其余的在任何平臺都是一樣的。雖說現在VSCode和上面的大部分插件都運行的不太穩定,但是我還是很喜歡這種組合進行跨平臺的輕量級開發的。
FAQ
-
Q: VSCode或編譯器找不到頭文件?
A: 如果VSCode用綠色波浪線給你劃出那些找不到源的代碼時,將鼠標停留在波浪線上,然后會出現一個小 燈泡。點“Add include path to settings.”。然后它會自動幫你建立一個名為“c_cpp_properties.json”的文件。
"name": "Mac",
"includePath": [
"${workspaceRoot}",
"/usr/include",
"/usr/local/include"
],
你會在其中找到類似上述代碼塊的地方,根據“name”后面所描述的系統,在其下的“includePath”中手動添加頭文件目錄。JSON語法。
-
Q: 為什么路徑動不動就寫成
${fileDirname}/${fileBasenameNoExtension}.out
?A: 這樣做的好處就是可以在同一配置下進行多個單文件的編譯開發,不用每次生成和調試的時候都去寫配置文件。使用場景嘛,主要就是寫寫算法題之類的。
我寫算法題時的目錄結構
.out
后綴名就是自己瞎起的。不同平臺的可執行后綴名都不一樣,這樣寫就跟誰都不沾邊了... -
Q: 如果我不用
vector-of-bool.cmake-tools
插件,要如何Build?A: 寫完
CMakeLists.txt
后,打開VSCode中自帶的終端(點擊底邊欄的輸出按鈕)
鍵入:
cmake .
會生成系統對應的項目(如果你是Windows并安裝了Visual Studio,他就會生成VS項目)。若想生成
MinGW Makefiles
則鍵入cmake -G "MinGW Makefiles" .
(注意區分大小寫),之后會為你生成makefiles,然后再鍵入make
(若沒制作前面所提到的mingw32-make.exe
的名為make.exe
的副本,則鍵入mingw32-make
),最終生成可執行文件。