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) 运行: 

发布了84 篇原创文章 · 获赞 2 · 访问量 5217

猜你喜欢

转载自blog.csdn.net/finghting321/article/details/105550120