網(wǎng)站cms大全枸櫞酸西地那非片的作用及功效
引言
本篇文章講述如何簡單的使用cmake工具構建一個項目,幫助入門的c++新手學會如何使用cmake.
我們在Clion新創(chuàng)建一個項目時,會發(fā)現(xiàn),除了main.cpp文件之外,還存在一個build-debug目錄和一個CMakelists.txt文件,如圖:
CMakelists.txt
CMakelists.txt這個文件描述的是這個項目待編譯的源文件,編譯選項,庫依賴等信息,類似于java項目中的maven.簡單來說呢,Cmakelists.txt就是一個描述你這個項目總結構的一個文件.它默認的結構是這樣的:
cmake_minimum_required:
是指能接受的cmake工具的最低版本
project:
是指該項目的項目名
set:
指的是當前使用的C++版本,如圖,目前使用C++17
add_executable:
指該項目的項目名,和所有待編譯的源文件.
cmake-build-debug目錄:
在Clion中默認是這個樣子的:
那么當我們點擊Clion右上角的運行按鈕時,不僅終端出會輸出hello,world的運行結果,在cmake-build-debug這個文件夾中也會多出一部分內容,多出的這部分內容是構建的中間文件.
構建過程
當我們在Clion中點擊運行按鈕的時候,Clion會幫助我們自動構建項目,但是實際的構建過程是怎樣的呢?
1.首先,CMakelists.txt里記錄的是這個項目的一個總結構,庫依賴等信息
,我們可以使用cmake命令進行構建
cmake Path
cmake命令會根據(jù)Cmakelists.txt里面的內容,在對應的路徑下生成一個makefile文件.
Makefile 文件是一個包含構建規(guī)則的文本文件,它定義了如何將源代碼文件轉換為可執(zhí)行文件或庫文件。Makefile 文件中包含了目標(target)、依賴項(dependencies)和命令(commands)。目標表示要生成的文件,依賴項表示目標所依賴的文件,而命令則是執(zhí)行構建過程的具體命令。
2.通過執(zhí)行 make 命令,Make 工具會讀取當前目錄下的 Makefile 文件,并根據(jù)其中的規(guī)則和命令來執(zhí)行構建過程。Make 工具會分析文件的依賴關系,檢查目標文件和依賴文件的時間戳,以確定是否需要重新編譯某個文件。然后,它會按照規(guī)則中定義的命令來執(zhí)行編譯、匯編和鏈接等操作,從而生成最終的可執(zhí)行文件或庫文件。
make path
必須有makefile文件才能執(zhí)行make命令,然后就會生成一個可執(zhí)行文件,這個可執(zhí)行文件,就是一個簡單項目的運行結果.
Makefile 文件是非常靈活和可定制的,你可以根據(jù)項目的需要定義自己的規(guī)則和命令。通過 Make 工具和 Makefile 文件,你可以更加方便地管理和構建 C++ 項目,并確保代碼在不同平臺上的可移植性。
所以說構建一個項目的大致過程就是
Cmakelists.txt ------>makefile--------> project(可執(zhí)行文件)cmake make
我們都知道,一個純文本的CPP文件,要變成可執(zhí)行文件,是要經(jīng)歷四個過程的,分別是:
預處理階段,編譯階段,匯編階段,鏈接階段
那么其實這些過程就是在make命令執(zhí)行makefile文件中的命令這個階段中執(zhí)行的
但是為什么Clion中,在build目錄下沒生成makefile文件呢,而是生成了一堆構建的中間文件?
這是因為Clion簡化了構建過程,所以沒有生成可讀的makefile文件,但是它的實際構架過程也是這個過程.
簡單的構建例子
如果我們不使用Clion,而是直接用命令行運行一個簡單項目應該怎么辦?
1.創(chuàng)建一個項目文件夾
mkdir my_project
cd my_project
2.創(chuàng)建一個main.cpp
vim main.cpp隨便寫點Hello,world之類的
3.創(chuàng)建CMakelists.txt文件
vim CMakelists.txt寫入:
cmake_minimum_required(VERSION 3.24)
project(my_project)
set(CMAKE_CXX_STANDARD 17)
add_executable(my_project main.cpp)
4.創(chuàng)建一個build目錄
mkdir build
cd build
5.執(zhí)行cmake命令,會生成一個makefile
cmake ..
6.執(zhí)行make命令,會生成一個可執(zhí)行文件
make
7.執(zhí)行可執(zhí)行文件,輸出結果
./可執(zhí)行文件的名字
當然這只是一個最簡單的例子
下面我們用Clion,利用CMakelists.txt寫一個稍微復雜一丟丟的項目
接下來我將舉一個簡單例子,來講一下CMakelists.txt的一些其他用法.
微項目
項目結構:
我們創(chuàng)建一個include的目錄,用來存儲頭文件,因為我們在寫C++項目時,需要有一個習慣,就是在.h文件中定義類和函數(shù),但是并不寫函數(shù)體,而是在.cpp文件中來完成函數(shù)體的部分.
Student.h:
#ifndef UNTITLED8_STUDENT_H
#define UNTITLED8_STUDENT_H
#include<string>class Student
{int age;std::string name;
public:Student(std::string name){this->name=name;}std::string get_name();
};
#endif //UNTITLED8_STUDENT_H
Student.cpp
#include "Student.h"std::string Student::get_name() {return this->name;
}
當寫到這里的時候就會出現(xiàn)點問題,當我們在寫入
#include "Student.h"的時候會發(fā)現(xiàn),這部分代碼會標紅,這是因為使用
Student.h跟Student.cpp不在同一個文件夾之下,我們可以使用
#include"../include/Student.h"
來引入這個頭文件,但是這樣太麻煩了,我們還是希望使用
#include"Student.h"這樣簡單的寫法,所以我們可以在CMakelists.txt文件中寫點東西:
加上這行之后,我們就可以直接使用 #include "Student.h"來引入了,include是頭文件所在的目錄名.
main.cpp
#include <iostream>
#include"Student.h"
int main() {Student *stu =new Student("sunjin,hello");std::cout<<stu->get_name()<<std::endl;return 0;
}
但是現(xiàn)在又有一個問題,我們需要在CMakelists.txt下,把Student.cpp也添加上去,否則Student.cpp是不會被編譯的
我們可以用
aux_source_directory給 ./src下面所有的文件起一個別名,然后把這個別名
加入到 add_executable中,這樣src目錄下面(一級)的所有文件就都能被編譯了,但是這樣并不能編譯子目錄下的文件,需要再用別名.
cmake_minimum_required(VERSION 3.24)project(untitled8)set(CMAKE_CXX_STANDARD 17)include_directories(include)aux_source_directory(./src DIR)add_executable(untitled8 ${DIR})
做好這些之后,我們可以點擊運行鍵,然后就可以運行了,也可以自己建一個build目錄,手動cmake和make.
up我不是匠人