1. 程式人生 > >VSCode的多個(C/C++)原始檔的編譯執行(Linux)

VSCode的多個(C/C++)原始檔的編譯執行(Linux)

引言

VSCode作為微軟推出的一款免費的輕量級的整合開發環境,可謂是良心之作。它擁有VS的高顏值,而且像瑞士軍刀一樣,擁有豐富的外掛,c/c++、java、python、js、html等等,它都能輕鬆駕馭。
在這裡介紹關於多個C/C++原始檔在VSCode編譯執行的方式方法,這裡會用到makefile以及Opencv.
注意:這裡預設你已經在Linux系統上配置好了Opencv環境,只有這樣你才能成功執行例項程式。
Linux安裝Opencv參考連結:https://blog.csdn.net/qq_34347375/article/details/81137142

目錄

安裝

在Linux中如何安裝VSCode就不在這裡贅述。
如果想在VSCode中編譯執行C/C++,建議安裝這四個外掛:

  • C/C++
  • C++ Intellisense
  • Code Runner
  • Include Autocomplete
    image_1cirkvga417v61ohpf7982r1mer29.png-85.1kB

配置

在寫程式之前先進行一些基礎的配置.
進入VSCode的使用者設定,設定一下引數:

  • code-runner.executorMap
    因為我們是通過makefile檔案來進行編譯連結源程式的,所以在這裡更改如下:
"c": "cd $dir && make $fileNameWithoutExt
&& ./$fileNameWithoutExt && make clean"
, "cpp": "cd $dir && make $fileNameWithoutExt && ./$fileNameWithoutExt && make clean",

image_1ciroqbp41f1218og1qof13ds13ri9.png-178.2kB
+ code-runner.runInTerminal

"code-runner.runInTerminal": true

這是為了保證能夠從終端輸入。

編寫源程式

我們建立這四個原始檔。程式碼分別如下:

.
├── main.cpp
├── makefile
├── multifile.cpp
└── multifile.hpp
// main.cpp

#include <iostream>
#include <opencv2/opencv.hpp>
#include "multifile.hpp"
using namespace std;
using namespace cv;

int main()
{
    MultiFile *m = new MultiFile;
    m->showstr();
    VideoCapture testCamera;
    testCamera.open(0);
    int n = 100;
    while(n){
        Mat src;
        testCamera >> src;
        imshow("test", src);
        waitKey(30);
        n--;
    }
    delete m;
    return 0;
}
// multifile.hpp

#pragma once
#include <iostream>
using namespace std;

class MultiFile
{
private:
    /* data */
public:
    MultiFile(/* args */);
    ~MultiFile();
    void showstr();
};
//multifile.cpp

#include "multifile.hpp"

MultiFile::MultiFile(/* args */)
{
    cout << "multifile constructed function" << endl;
}

MultiFile::~MultiFile()
{
    cout << "mutifile destructor" << endl;
}

void MultiFile::showstr()
{
    cout << "show some string" << endl;
}
# makefile

# 描述: multifile 專案 makefile檔案
# 版本: v1.0
# 修改記錄:  1.先測試普通的cpp檔案的編譯執行
#           2.使用變數來改進我們的makefile檔案
#           3.新加了一個原始檔
#           4.使用偽目標,加上clean規則
#           5.使用wildcard函式,自動掃描當前目錄下的原始檔
#           6.加入了自動規則依賴

# # 定義了可執行檔案變數
# executable    := main
# # 定義了原始檔列表變數
# sources := $(wildcard *.cpp)
# # 使用變數的引用替換,定義了object檔案列表
# objects := $(sources:.cpp=.o)
# # 使用變數引用替換,定義依賴檔案列表
# deps  := $(sources:.cpp=.d)
# # 定義編譯命令變數
# CC    := g++
# rm    := rm -rf
# # 終極目標規則,生成可執行檔案
# $(executable) : $(objects)
#   $(CC) -o [email protected] $^

# $(objects): %.o:%.cpp 
#   $(CC) -o [email protected] -c $<

# #clean規則 
# .PHONY: clean
# clean:
# #清除編譯生成的所有檔案
# #$(RM) $(executable) $(objects) $(deps)
# #清除編譯生成的所有檔案,不包括可執行檔案
#   $(RM) $(objects) $(deps)

# # 自動規則依賴
# sinclude $(deps)
# $(deps):%.d:%.cpp
#   $(CC) -MM $< > [email protected]

# 描述: multifile 專案 makefile檔案
# 版本: v2.0
# 修改記錄:  1.先測試普通的cpp檔案的編譯執行
#           2.使用變數來改進我們的makefile檔案
#           3.新加了一個原始檔
#           4.使用偽目標,加上clean規則
#           5.使用wildcard函式,自動掃描當前目錄下的原始檔
#           6.加入了自動規則依賴
#           7.實現了opencv程式的編譯
# 定義了可執行檔案變數
executable  := main
# 定義了原始檔列表變數
sources := $(wildcard *.cpp)
# 使用變數的引用替換,定義了object檔案列表
objects := $(sources:.cpp=.o)
# 使用變數引用替換,定義依賴檔案列表
deps    := $(sources:.cpp=.d)
# 定義編譯命令變數
CC  := g++
rm  := rm -rf

#需要呼叫的連結庫
LIBS    :=  -lopencv_calib3d \
            -lopencv_core \
            -lopencv_dnn \
            -lopencv_features2d \
            -lopencv_flann \
            -lopencv_highgui \
            -lopencv_imgcodecs \
            -lopencv_imgproc \
            -lopencv_ml \
            -lopencv_objdetect \
            -lopencv_photo \
            -lopencv_shape \
            -lopencv_stitching \
            -lopencv_superres \
            -lopencv_video \
            -lopencv_videoio \
            -lopencv_videostab
# 標頭檔案路徑
INCLUDE :=  -I/usr/local/include/opencv \
            -I/usr/local/include/opencv2
# 連結庫路徑
LDFLAGS :=  -L/usr/local/lib
# 終極目標規則,生成可執行檔案
$(executable) : $(objects)
    $(CC) -o [email protected] $^ $(LDFLAGS) $(LIBS)

$(objects): %.o:%.cpp 
    $(CC) -o [email protected] -c $< $(INCLUDE)

#clean規則 
.PHONY: clean
clean:
#清除編譯生成的所有檔案
#$(RM) $(executable) $(objects) $(deps)
#清除編譯生成的所有檔案,不包括可執行檔案
    $(RM) $(objects) $(deps)

# 自動規則依賴
sinclude $(deps)
$(deps):%.d:%.cpp
    $(CC) -MM $< > [email protected]

注意:

  • Code runner外掛應當在main.cpp檔案下使用,並且makefile檔案中可執行檔名稱要與之一致。具體情況請看外掛說明。
  • 這裡提供了兩個版本的makefile檔案內容,一個是針對單純的多檔案c/c++源程式的編譯連線,一個是針對包含opencv源程式的編譯連結。

執行

執行結果如下:
image_1cirp1c521bno11961ijn1be2crt1m.png-459.6kB

相關推薦

Shell程式設計---監控遠端主機磁碟使用情況並郵件報警

要求:監控多個(遠端主機)磁碟使用情況並郵件報警 分析: 任何一個分割槽使用到80%就傳送一個郵件幾個人通知提醒他們磁碟的使用情況; 任何一個分割槽使用到90%以上就在郵件主題給出警告(warning); Linux伺服器上傳送郵件程式我們使用sendmail。

VSCodeC/C++原始檔編譯執行(Linux)

引言 VSCode作為微軟推出的一款免費的輕量級的整合開發環境,可謂是良心之作。它擁有VS的高顏值,而且像瑞士軍刀一樣,擁有豐富的外掛,c/c++、java、python、js、html等等,它都能輕鬆駕馭。 在這裡介紹關於多個C/C++原始檔在V

C#實現類只例項化一次類訪問呼叫

C#簡單寫法如下: public  class  Singleton {      private  static  Singleton _instance =  n

C語言 字符二維數組字符串探討 求解

字符數 沒有 一個 spa style 字符串類 hello world c語言 字符 什麽是二維字符數組? 二維字符數組中為什麽定義字符串是一行一個? “hello world”在C語言中代表什麽? C語言沒有字符串類型? C語言 字符二維數組(多個字符串)探討 求解

C# Socket簡單例子伺服器與客戶端通訊

這個例子只是簡單實現瞭如何使用 Socket 類實現面向連線的通訊。 注意:此例子的目的只是為了說明用套接字寫程式的大概思路,而不是實際專案中的使用程式。在這個例子中,實際上還有很多問題沒有解決,如訊息邊界問題、埠號是否被佔用、訊息命令的解析問題等。。 下面是兩個

一個簡單的MapReduce示例MapReduce任務處理

.lib exceptio apr private util sum length reat lin 一、需求   有一個列表,只有兩列:id、pro,記錄了id與pro的對應關系,但是在同一個id下,pro有可能是重復的。   現在需要寫一個程序,統計一下每個id下有

關於需要添加相同屬性的數據到後臺例如抽獎需要輸入獎品及其概率的方法

ray document spa abi nbsp 數組 end 處理 ability 頁面JS部分(name 屬性要相同,組成一個數組) var Array = document.getElementsByName("Prize"); var P

網絡請求成功返回再執行另外任務的思路分析iOS

cnblogs 運行 == set 聯系 demo use 但是 clas 前言 今天我們來討論一個經常出現的需求場景,也是一個老話題。在開發中我們往往會遇到需要進行多個網絡請求,並且需要多個網絡請求成功返回後再做其他事的場景。比如同一個界面顯示的內容需要用到兩個網絡接口

一個權重的物體拷貝權重給oneWeightToMany

目的 method 項目 point 點擊 imp 實體 oci %s 你是否在做項目的時候經常會遇見一個物體帶權重需要拷貝給其他物體,這時候其他物體多的數不勝數 你怎麽辦呢? 舉例:假如一頭獅子 身體你已經做好了,但是模型師把半個身體都做滿了垂落的實體模型毛發,你是否感到

查詢oracle資料庫是否有重複資料根據欄位判斷

根據多個欄位查詢重複資料的總條數: sql = "select count(*) from tablea a where (a.askname, a.atime) in (select askname,atime from tablea group by askname,atime having count

LinuxUbuntu16.04下編寫執行C語言程式

       最初學習C語言用的是Visual C++6.0,後來還用過一些IDE,複製貼上都可以用滑鼠對目標進行選擇即可。但在Linux系統裡,需要熟練掌握在Terminal裡編寫C語言程式,進行編譯除錯。本章

Hadoop EcosystemHadoop生態環境-130相關開源專案

Apache Hadoop專案開發用於可靠、可擴充套件的分散式計算的開源軟體。 Apache Hadoop軟體庫是一個框架,允許使用簡單的程式設計模型跨計算機叢集分散式處理大型資料集。 它旨在從單個伺服器擴充套件到數千臺計算機,每臺計算機都提供本地計算和儲存。

時間序列變數+一步

''' PART 1:多個x時間變數用於預測y的時間 但是y不作為x的一份子 ''' # 創造資料 from numpy import array from numpy import hstack from keras.models import Sequential from keras.laye

Redis分散式叢集部署安裝及細節一臺主機搭建服務--偽叢集

Redis分散式叢集部署安裝及細節  一: redis cluster介紹篇 1:redis cluster的現狀 目前redis支援的cluster特性(已親測): 1):節點自動發現 2):slave->master選舉,叢集容錯 3):Hotreshar

SOLR對關聯表建立索引

原文:http://www.cnblogs.com/liaidai/p/4906714.html 一、無關聯多表建立索引 1.1資料庫準備   首先在資料庫建立一張表,本來有一個tuser表了,我又建立了一個role表,就兩三個欄位,沒什麼特殊的,然後在裡面隨便新增幾條資

.h和.c檔案的使用

func.h #ifndef FUNC_H #define FUNC_H int f(); #endif func.c #include "func.h" int f(){  return 1; } Test.c #include <stdio.h> #in

Android 6.0+ 動態許可權 一種清爽的封裝過程以及許可權的處理

Android 6.0 之前我們申請許可權直接在配置檔案中配置一下即可,但是6.0之後,谷歌官方將許可權分為普通許可權和危險許可權。對於危險許可權來說,我們就需要進行動態設定了。本文主要講解為什麼要進行Android 6.0 動態許可權的設定、動態許可權的使用、

pyenv和virtualenv管理python的版本版本同時用

雜項 http pip git gin 創建 再次 是你 note 1、homebrew安裝: https://brew.sh/index_zh-cn 2、pyenv安裝使用: https://blog.csdn.net/m0_37998140/article/deta

oracle 更新欄位,更新非空欄位null、‘’、一個或空格的情況

UPDATE LOA_FUND_HOLD_DTL    SET TRANS_STATUS = '2',    AND FAIL_INFO = NVL(TRIM(' ' from rec.FAIL_INFO),'主機對賬失敗。'),    A

c++實現鏈棧的基本操作附帶main函式 可編譯執行

資料結構老師佈置了鏈棧的基本操作,讓我們儘量嘗試用class實現,然後我在網上參考了一部分,自己寫了一個,有不足之處懇請大家指出 /*  *  檔名:鏈棧.c  *    鏈棧的實現  *    版本:2.0  *    時間:2016.11.4  *    作者:Wan