面向Linux C++的CMake簡明教程(Jetson Nano)

 

目錄

1. CMake簡介

2.環境配置

3.示例程序Hello World

4. 包含其它.h和.cpp文件


1. CMake簡介

本教程面向Linux系統,重點講解CMake的基本使用方法,用於構建C++項目。採用的平臺爲Jetson Nano嵌入式開發板,arm64系統。當然,本教程同樣適合絕大部分Linux平臺。在講解CMake使用方法之前,先要了解gcc、make和MakeFile的概念。

gcc(GNU Compiler Collection)即爲GNU編譯器套件,也可以簡單認爲是編譯器,它可以編譯很多種編程語言,包括C、C++、Objective-C、Fortran、Java等。當程序只有一個源文件時,直接就可以用gcc命令編譯它。但如果源文件太多,一個一個編譯就會顯得非常繁瑣,於是研發人員想到,爲什麼不設計一種類似批處理的程序,來批處理編譯源文件呢,於是就有了make工具。make是一個自動化編譯工具,可以使用一條命令實現完全編譯。前提是需要編寫一個規則文件,make依據該規則文件來批處理執行編譯,這個文件就是makefile。對於一個大工程,編寫makefile是件極其複雜的事,手動編寫不僅耗時且容易出錯,於是研發人員又想到,爲什麼不設計一個工具,讀入所有源文件之後,自動生成makefile呢,於是就出現了CMake工具,它能夠輸出各種各樣的makefile或者project文件,從而幫助開發人員減輕負擔。但是隨之而來也就是編寫cmakelists文件,它是CMake所依據的規則。值得注意的是,相對於編寫makefile文件,編寫cmakelists文件要簡單的多。下面這張圖完整顯示了實際編譯的各個步驟及相互關係:

可以看到,CMake生成的makefile文件還不是可執行文件,需要再經過make生成後纔是最終的二進制可執行文件。

簡而言之,對於實際的C++工程來說,採用CMake工具可以減少項目編譯所需要的繁瑣工作,簡化並加快開發人員生成最終的程序。

2.環境配置

爲了方便開發,本教程使用QT這款集成開發環境來編寫C++代碼。首先安裝相關軟件:

1. 安裝CMake

sudo apt-get install cmake

安裝完成後使用下述命令查看CMake版本號:

cmake -version

2. 安裝QT

sudo apt-get install qt5-default qtcreator -y

 

3.示例程序Hello World

按照步驟2安裝完QT後,下面首先創建一個入門級程序helloworld。打開QT Creator程序,單擊New Project,如下圖所示:

然後單擊Non-QT Project選擇Plain C++ Application,因爲此處我們並不需要創建帶界面的C++程序,因此只需要創建非QT的普通C++控制檯程序即可,如下圖所示。

單擊Choose進入項目創建界面,按照下圖所示輸入項目名稱helloworld:

單擊下一步,選擇編譯工具爲CMake,如下圖所示:

然後默認一直單擊下一步直至完成創建。此時,QT已經自動爲我們創建了一個簡單的hello world樣例程序,並且創建了CMakeLists.txt文件,如下圖所示:

按ctrl+r可以直接運行項目。輸出如下:

打開CMakeLists.txt文件,內容如下:

cmake_minimum_required(VERSION 2.8)
project(helloworld)
(${PROJECT_NAME} "main.cpp")

上述代碼第一行定義了CMake的版本,方便將來該項目移植到其它平臺可以順利的根據定義的版本進行編譯。第二行代碼用於設置項目名稱,此處即爲helloworld。第三行採用了add_executable命令用於生成可執行程序,其中${PROJECT_NAME}指定採用項目名作爲最終的生成的可執行程序名,並且使用main.cpp源文件來生成。

QT已經將所有的編譯工作進行了簡化,使得我們定義好CMakeLists文件以後按ctrl+r即可直接進行編譯和項目生成,不需要再使用CMake命令在控制檯進行編譯。當然,此時可以找到項目同目錄下有個新生成的build-helloworld-unknown-Default文件夾,該文件夾存儲了整個編譯過程的中間文件和最終生成的可執行程序,這些中間文件中包含MakeFile文件。

4. 包含其它.h和.cpp文件

項目中經常需要引入其它庫文件,包括.h頭文件和.cpp源文件。下面實現一個自定義的加法函數,學習如何在項目中通過CMake配置引用外部文件。

繼續第3節的內容,在helloworld工程目錄下面創建兩個文件夾,分別命名爲include和src。這兩個文件夾將作爲外部引用文件的頭文件和源文件目錄。在QT中單擊菜單欄“文件”——“新建文件或項目”,首先創建一個頭文件mytool.h,如下圖所示:

 

單擊choose進入頭文件配置界面,選擇到include路徑,並且填入頭文件名爲mytool.h,如下圖所示:

 

最後單擊完成即可。接下來採用同樣的步驟在src目錄下創建mytool.cpp文件。

創建完上述兩個文件後需要將這兩個文件加入到我們的項目中,重新編輯CMakeLists.txt文件如下:

cmake_minimum_required(VERSION 2.8)

project(helloworld)
include)

add_library(lib_tool
src/mytool.cpp
)
link_libraries(lib_tool)
add_executable(${PROJECT_NAME} "main.cpp")

上述代碼中INCLUDE_DIRECTORIES用於爲項目添加引用目錄,這樣我們的項目就可以正確的引用include目錄下的頭文件了。add_library命令用於爲項目添加一個庫,庫名此處定義爲lib_tool,庫路徑中添加相關的源文件,此處爲src文件夾下的mytool.cpp文件。然後使用命令link_libraries將庫導入進來。按ctrl+s鍵保存修改,此時QT會根據CMakeLists.cpp的修改自動的修改項目結構,如下圖所示:

編輯mytool.cpp文件如下:

#include "mytool.h"

int myadd(int a,int b)
{
    return (a+b);
}

該函數爲自定義的一個加法函數,實現兩個int型變量的加法。

編輯mytool.h文件如下:

#ifndef MYTOOL_H
#define MYTOOL_H

#endif // MYTOOL_H

int myadd(int a,int b);

此處主要是一個申明函數,用於導出該函數。

最後,在main.cpp中調用myadd函數,具體如下:

#include <iostream>
#include "mytool.h"

using namespace std;

int main()
{
    int b=myadd(1,2);
    cout << b << endl;
    return 0;
}

按ctrl+r運行項目查看輸出結果,如下所示:

可以看到程序正確的輸出了結果。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章