基於VSCode的C/C++語言的構建調試環境搭建指南


VScode的C/C++語言環境配置

安裝vscode以及相關插件以及C++編譯器

首先沒什么好說的,按照如下鏈接下載好VScode並且安裝

https://code.visualstudio.com/

之后,啟動vscode,ctrl+shift+X,打開插件商店,我們來安裝如下插件

其實VScode本質上是一個代碼編輯器,並沒有編譯運行C/C++代碼的能力,我們說是要配置C/C++開發環境,其實背后還是調用了我們電腦上其他地方的C/C++編譯器,所以在最后,我們要安裝。這里我推薦mingw64。其實這種資源是非常容易找到的,這里也就不提供鏈接了,實在找不到的可以私聊我。下載好mingw64對應的壓縮包后,解壓到你想要的位置,並將該目錄下bin文件夾置添加到環境變量,具體怎么添加,我相信你肯定也會,原因也很簡單,bin里面都是可執行文件嘛。配置好之后打開shell輸入gcc,如果不報錯,ok,那就證明你配置成功了。下面是我的mingw64路徑以及對應的環境變量,以及輸入gcc之后的效果


自動生成配置文件,進行運行&調試————配置默認生成任務

上課的時候也講了,想要讓vscode運行代碼,也得寫配置文件,往里面填GCC命令。當然,比如我們刷算法題時,面對只有一個源文件的小任務,我們可以不用手動配置,直接自動生成即可。鍵盤按住ctrl+shift+P,選擇如下選項

即可自動生成配置文件。它不僅支持運行,還支持斷點調試等實用功能。我們來看一下這些事情。

#include <stdio.h>
#include <math.h>
#include <stdlib.h>
double func(double x)
{
    return exp(x);
}
double prob(int a, int b, double c, double d, int n, double func(double x))
{
    double square = (b - a) * d;
    int count = 0;
    int loop = n;
    while (loop > 0)
    {
        double random_y = rand() / (double)RAND_MAX * d;
        double random_x = rand() / (double)RAND_MAX * (b - a) + a;
        double ans = func(random_x);
        if (random_y <= ans)
        {
            count += 1;
        }
        loop -= 1;
    }
    double prob = (double)count / n;
    return prob * square;
}
int main()
{
    double ans = prob(0, 1, exp(0), exp(1), 10000000, func);
    printf("%f", ans);
}

如上是一個求\(\int_{0}^{1}e^{x}dx\)的概率算法。我們按F5,在第25行上打上斷點,看看我們能不能做到斷點調試,並且查看變量值,走你。

你也看見了,所有的變量都能看得清清楚楚。那么這個算法最后能運行出正確結果嗎?我們接着看。

\(\int_{0}^{1}e^{x}dx=e-1\approx1.71828\),和我們的結果非常相近,畢竟這是個數字概率算法,在循環次數較少的情況下,這已經很精確了。

使用cmake自動生成makefile

上課老師也講了makefile,確實比手敲編譯指令方便了點,但是這玩意學習成本也不低,自己寫起來也煩。其實早就有自動生成makefile的工具可以用了,而且不止一種。
cmake可以在大型工程中自動生成makefile,關鍵在於 CMakeLists.txt這個配置文件

# 最低CMake版本要求
cmake_minimum_required(VERSION 3.10.0)

# 項目名稱
project(cmake-test)

# 設置C/C++標准
set(CMAKE_C_STANDARD 11)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# 頭文件路徑
include_directories("Inc")

# 枚舉頭文件
file(GLOB_RECURSE INCLUDES "Inc/*.h" "Inc/*.hpp")

# 枚舉源文件
aux_source_directory("Src" SOURCES)

# 輸出路徑
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)

# 生成可執行的文件
add_executable(${PROJECT_NAME} ${SOURCES} ${INCLUDES})

# 生成庫文件,STATIC為靜態庫,SHARED為動態庫  
add_library(test STATIC src/test.cpp)  
# 鏈接一個內部依賴庫  
target_link_libraries(Demo test)

動態庫與靜態庫簡介

除了生成可執行文件,我們還可以生成庫文件.Windows中靜態庫.lib后
綴,動態庫為.dll,linux中靜態庫.a后綴, 動
態庫.so后綴
那么什么是庫文件呢?分別來介紹一下
靜態庫文件:鏈接階段,庫中目標文件所含的所有將被程序使用的函數的機器碼,被copy到最終的可執行文件中。
因此對應的鏈接方式稱為靜態鏈接。
特點

  • 靜態庫對函數庫的鏈接是放在編譯時期完成的
  • 程序在運行時與函數庫再無瓜葛,移植方便
  • 運行效率相對快
  • 占用磁盤和內存空間,因為所有相關的目標文件與牽涉到的函數庫被鏈接合成一個可執行文件。

局限性

  • 空間浪費是靜態庫的一個問題
  • 靜態庫對程序的更新、部署和發布頁會帶來
    麻煩
  • 如果靜態庫lib更新了,所以使用它的應用程
    序都需要重新編譯、發布給用戶
  • 對於玩家來說,可能是一個很小的改動,卻
    導致整個程序重新下載,全量更新

那什么是動態庫呢?
程序編譯時並不會被連接到目標代碼中,而是在程序運行是才被載入。
特點

  • 可執行文件只包含它需要的函數的引用表,而不是所有的函數代碼
  • 只有在程序執行時, 那些需要的函數代碼才被拷貝到內存中
  • 動態庫在程序運行是才被載入,也解決了靜態庫對程序的更新、部署和發布頁會帶來麻煩。用戶只
    需要更新動態庫即可,增量更新。
  • 但依賴的模塊也要存在,如果使用載入時動態鏈接,
    程序啟動時發現DLL不存在,系統將終止程序並給出
    錯誤信息,依賴性強。

總結

  • 靜態庫是犧牲了空間效率,換取了時間效率
  • 共享庫是犧牲了時間效率,換取了空間效率

工程應用

  • 一般在比較固定參數的工程項目中,如底層驅動邏輯比較穩定,會考慮靜態庫的使用;
  • 在需要多次調試優化版本中,比如PUBG(吃雞)的游戲平衡體驗更新,會考慮動態庫的使用。

實戰

我們將最開始的概率算法修改一下,把待計算函數部分和概率算法部分分別模塊化,最后被一個main函數調用。目錄結構如下,我們改為C++語言實現,這也是為了向大家演示,那個插件以及mingw也是支持C++的:
.
├── CMakeLists.txt
├── inc
│   ├── cal_func.h
│   └── prob.h
├── main.cpp
└── src
├── cal_func.cpp
├── CMakeLists.txt
└── prob.cpp
接下來我們編寫src內部的CMakeLists.txt,用來生成靜態庫文件

# 最低CMake版本要求
cmake_minimum_required(VERSION 3.10.0)

# 頭文件路徑
include_directories("../inc")


aux_source_directory(. DIR_LIB_SRCS)

# 生成可執行的文件
add_library (static_lib STATIC ${DIR_LIB_SRCS})

我們執行cmake .來看下效果

你也看見了,我們通過cmake自動生成的makefile來生成了我們想要的libstatic_lib.a文件
我們最后寫項目根目錄的CMakeLists.txt

# 最低CMake版本要求
cmake_minimum_required(VERSION 3.10.0)

# 項目名稱
project(prob_algo)

# 設置C/C++標准
set(CMAKE_C_STANDARD 11)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# 添加 src 子目錄
add_subdirectory(src bin)	
include_directories(inc)
# 指定生成目標 
add_executable(prob_algo main.cpp)

# 添加鏈接庫
target_link_libraries(prob_algo static_lib)

我們來通過cmake .生成makefile,用make來編譯,最后執行看看效果如何

你也看見了,在最后,我們使用cmake來編譯的項目生成了正確的定積分值。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM