Linux下CMake安裝使用

1. CMake介紹

CMake是“cross platform make”的縮寫,是一個跨平臺的安裝(編譯)工具,可以用簡單的語句來描述所有平臺的安裝或編譯過程。Cmake 並不直接建構出最終的軟件,而是產生標準的建構檔,如 Unix 的 makefile 或 Windows的 projects/workspaces,然後再依一般的建構方式使用。在輸出makefile或者project文件的同時,能測試編譯器所支持的C++特性。CMake 的組態檔取名爲 CmakeLists.txt,每個目錄一個。

CMake 使用一個名爲 CMakeLists.txt 的文件來描述構建過程,可以產生標準的構建文件,如 Unix 的 Makefile 或Windows Visual C++ 的 projects/workspaces 。文件 CMakeLists.txt 需要手工編寫,也可以通過編寫腳本進行半自動的生成。CMake 提供了比 autoconfig 更簡潔的語法。在 linux 平臺下使用 CMake 生成 Makefile 並編譯的流程如下:

1) 編寫CMakeLists.txt

2) 執行命令“cmake PATH”或者“ccmake PATH”生成 Makefile ( PATH 是 CMakeLists.txt 所在的目錄 )

3) 使用 make 命令進行編譯。

 CMake的特點主要有:

1) 跨平臺,並可生成native編譯配置文件,在Linux/Unix平臺,生成makefile;在蘋果平臺,可以生成xcode;在Windows平臺,可以生成MSVC的工程文件;

2) 能夠管理大型項目,KDE4就是最好的證明;

3) 簡化編譯構建過程和編譯過程。Cmake的工具鏈非常簡單:cmake+make。

4) 高效慮,按照KDE官方說法,CMake構建KDE4的kdelibs要比使用autotools來構建KDE3.5.6的kdelibs快40%,主要是因爲 Cmake在工具鏈中沒有libtool。

5) 可擴展,可以爲cmake編寫特定功能的模塊,擴充cmake功能。

2. CMake下載安裝

直接在線安裝:apt-get install cmake  

離線安裝如下:

點擊下載安裝包,選擇對應的版本,這裏我選擇的是源碼版本安裝。

注意:如果下載的binary版本安裝

方法1:解壓後需要爲cmake創建軟連接

 # ln -s /home/app/cmake-3.17.0-Linux-x86_64/bin/*  /usr/bin/ 

驗證cmake的安裝是否成功:  cmake -version

方法2:

安裝包解壓後,編輯vim /etc/profile或者vim ~/.bashrc添加

export PATH=$PATH:/home/app/cmake-3.17.0-Linux-x86_64/bin

驗證cmake的安裝是否成功:  cmake -version

1) 源碼安裝

# cd /home

# mkdir app && cd app

# wget https://cmake.org/files/v3.17/cmake-3.17.0.tar.gz  //若手動下載,拷貝此路徑下

# tar -zxvf cmake-3.17.0.tar.gz

安裝gcc等程序包(安裝過則忽略)  # yum install gcc-c++

# cd cmake-3.17.0

# ./bootstrap

# gmake

# make install

2) 查看cmake版本

# cmake -version

3. CMake編譯原理

CMake主要是編寫CMakeLists.txt文件,然後用cmake命令將CMakeLists.txt文件轉化爲make所需要的makefile文件,最後用make命

令編譯源碼生成可執行程序或共享庫(so(shared object))。因此CMake的編譯基本就兩個步驟:cmake和make

cmake指向CMakeLists.txt所在的目錄,例如cmake .. 表示CMakeLists.txt在當前目錄的上一級目錄。cmake後會生成很多編譯的中間文件以及makefile文件,所以一般建議新建一個新的目錄,專門用來編譯,例如

# mkdir build 

# cd build

# cmake .. 

# make     

4. CMake樣例一

這裏舉例最簡單的HelloWorld

1) 新建工程目錄:用來存放工程文件的文件夾HelloWorld

2) 編寫源文件:HelloWorld.cpp,編寫如下內容:

#include <iostream>
using namespace std;
 
int main() {
  cout << "HelloWorld" << endl;
  return 0;
}

3) 編寫CMakeLists.txt:

在cpp文件同級目錄下新建一個CMakeLists.txt文件,編寫如下內容:

#cmake最低版本需求,不加入此行會受到警告信息
cmake_minimum_required(VERSION 3.17)
project(HelloWorld) #項目名稱
#把當前目錄(.)下所有源代碼文件和頭文件加入變量SRC_LIST
aux_source_directory(. SRC_LIST)
#生成應用程序 HelloWorld (在windows下會自動生成HelloWorld.exe)
add_executable(HelloWorld ${SRC_LIST})

4) 創建build目錄(目的:存放很多編譯的中間文件以及makefile文件,生成的配置工程都在build目錄下,比較清晰)

外部編譯方式:雖然cmake可以直接在當前目錄進行編譯,無須建立build目錄。但是,會將所有生成的中間文件和源代碼混在一起,而且cmake生成的makefile無法跟蹤所有的中間文件,即無法使用”make distclean”命令將所有的中間文件刪除。因此,我們推薦建立build目錄進行編譯,所有的中間文件都會生成在build目錄下,需要刪除時直接清空該目錄即可。這就是所謂的外部編譯方式。

# mkdir build

5) 編譯

# cd build

# cmake .. 

# make     

6) 運行:

#./HelloWorld

5. CMake樣例二(多文件)

1) 新建工程目錄:用來存放工程文件的文件夾Project

2) 編寫源文件:

Func.h

#ifndef __FUNC__
#define __FUNC__
class CFunc
{
public:
	CFunc();
	~CFunc();

	int Add(int x, int y);
};
#endif

Func.cpp

#include "../include/Func.h"
CFunc::CFunc()
{
}

CFunc::~CFunc()
{
}

int CFunc::Add(int x, int y)
{
	return x + y;
}

main.cpp

#include "../include/Func.h"
#include <stdio.h>
using namespace std;

int main() {
	CFunc *pFunc = new CFunc();
	int nRes = pFunc->Add(10, 20);
	printf("x + y = %d\n", nRes);
	return 0;
}

3) 編寫CMakeLists.txt:

在根目錄下新建一個CMakeLists.txt文件,編寫如下內容:

#1.cmake verson,指定cmake版本 
cmake_minimum_required(VERSION 3.2)
#2.project name,指定項目的名稱,一般和項目的文件夾名稱對應
project(TestAdd)
#3.head file path,頭文件目錄
include_directories(include)
#4.source directory,源文件目錄
aux_source_directory(src DIR_SRCS)
#5.set environment variable,設置環境變量,編譯用到的源文件全部都要放到這裏,否則編譯能夠通過,但是執行的時候會出現各種問題,比如"symbol lookup error xxxxx , undefined symbol"
set(TEST_ADD ${DIR_SRCS})
#6.add executable file,添加要編譯的可執行文件
add_executable(${PROJECT_NAME} ${TEST_ADD})
#7.add link library,添加可執行文件所需要的庫,比如我們用到了libXLSDKVCN.so(命名規則:lib+name+.so),就添加該庫的名稱
target_link_libraries(${PROJECT_NAME} XLSDKVCN)

4) 創建build目錄

# mkdir build 

5) 編譯

# cd build

# cmake .. 

# make 

6) 運行: 

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