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) 运行:
上一篇: CMake指令
下一篇: Boost学习之读写json
推荐阅读
-
Linux下CMake安装使用
-
Linux下离线安装Docker最新版本
-
LINUX下ORACLE定时备份数据,使用的expdp。
-
ubuntu下安装python开发集成环境 博客分类: linux linuxpythonanacondapfylll
-
ubuntu下安装python开发集成环境 博客分类: linux linuxpythonanacondapfylll
-
linux环境下安装配置Apache 博客分类: linux linuxapache配置安装
-
Mac系统下如何安装Nexus(使用Nexus搭建Maven私服)
-
Linux 下git的安装 博客分类: 版本控制工具 LinuxGit安装
-
Linux下Mysql 5.7的安装及远程连接配置 博客分类: Linux linuxmysql
-
SQLite3 安装及在Ruby下的使用