章節 連結
程式碼連結
目錄
- 2.1.1 C++ 工程的一般組織結構
- 2.1.2 C++ 工程在機器人中的組織結構
- 2.2 C++ 程式碼的編譯
- 2.2.1 g++ 編譯
- 2.2.2 make 編譯
- ✅ 2.2.3 CMake 編譯
2.1.1 C++ 工程的一般組織結構
一般情況下,C++工程的組織結構是將不同的功能封裝在不同的類中,每個類用配套的標頭檔案和原始檔來實現,標頭檔案可以是*.h
、*.hpp
之類的檔案,原始檔可以是*.cc
、*.cpp
之類的檔案。最後在 main 函式中,呼叫類來實現具體的功能。
2.1.2 C++ 工程在機器人中的組織結構
在機器人專案中,C++ 工程程式碼通常分成兩個部分:一個部分用於實現具體演算法,另一個部分用於進行 ROS 介面封裝。
ROS 介面負責資料輸入、資料輸出以及核心演算法呼叫
2.2 C++ 程式碼的編譯
3 種 編譯工具: g++、make、CMake
foo.h
// 宏定義 防止標頭檔案 重複包含與編譯
#ifndef FOO_H_
#define FOO_H_
#include <string>
// 名稱空間設定 防止出現 重複的函式與變數
namespace foo{
class MyPrint{
// 宣告類 具體函式實現 在 foo.cpp 中
public:
MyPrint(std::string output); // 建構函式
void ExcutePrint();
std::string output_;
};
}
#endif
foo.cpp
#include "foo.h" // 首先在 當前目錄 下搜尋需要包含的檔案
#include <iostream> // 首先在系統標頭檔案目錄中搜尋需要包含的檔案
#include <string>
//
// 如果是標準庫函式的標頭檔案,則使用<>包含標頭檔案;如果是自定義的標頭檔案,優先使用" "包含標頭檔案。
namespace foo{
MyPrint::MyPrint(std::string output):output_(output){
std::cout << "class MyPrint create a object!";
std::cout << std::endl;
}
void MyPrint::ExcutePrint(){
std::cout << output_ << std::endl;
}
}
main.cpp
#include "foo.h"
int main(int argc, char** argv){
// 建立 類 MyPrint 的例項物件, 並傳入 初始化引數
foo::MyPrint my_print("I can output string!");
my_print.ExcutePrint(); // 呼叫 物件中的成員函式
return 0;
}
2.2.1 g++ 編譯
若未安裝 g++:sudo apt install g++
已安裝則跳過。
預處理、編譯、彙編、連線。
g++ foo.cpp main.cpp -o demo
./demo
2.2.2 make 編譯
makefile
start: # 命令塊 命名 下面的命令後不能加註釋。 是直接在 命令列介面 執行的指令
g++ -o foo.o -c foo.cpp
g++ -o main.o -c main.cpp
g++ -o demo foo.o main.o
clean: # 刪除 中間檔案
rm -rf foo.o main.o
✅ 2.2.3 CMake 編譯
CMake可以自動處理程式之間的關係,併產生對應的 makefile 檔案,然後呼叫 make 就可以編譯了。
CMakeLists.txt
# 宣告 CMake 的最低版本
cmake_minimum_required(VERSION 2.8)
# 宣告 CMake 工程名
project(demo)
include_directories("${PROJECT_BINARY_DIR}")
# 建立庫檔案
add_library (foo foo.cpp)
# 建立 可執行檔案
add_executable (demo main.cpp)
# 為 可執行檔案 連線依賴庫
target_link_libraries (demo foo)
在 原始檔 所在目錄 開啟命令列視窗。
mkdir build
cd build
cmake ..
make
./demo
C++ 程式設計風格 可參考:https://github.com/google/styleguide?tab=readme-ov-file