【c/c++编译工具】——Cmake的学习

简介

目录

简介

1. Cmake的基本语法

2. 常用指令

3. CMake常用的变量

4. CMake编译工程

5. 构建方式

6.  实战---CMake代码实战


  • CMake是一个跨平台的安装编译工具,可以用简单的语句来描述所有平台的安装(编译过程)。
  • CMake可以说已经成为大部分C++开源项目标配

不同平台编译项目工程文件是不同的,如在Visual Studio下,需要msbuild文件,在linux下需要编写Makefile文件,所以一个工程在不同的平台需要编写多个编译文件。  但是有了cmake工具后,我们只需要编写CMakeLists.txt文件就可以解决跨平台编译的问题。

 假设一个工程新增添了一个文件bar.cpp,如果我们在linux编译,我们就需要手写makefile文件,如果在VS下编译,就需要写msbuild文件。如下:

 但是有了cmake工具后,我们只需要编写CMakeLists.txt文件,cmake会根据不同的平台生成对应的编译文件,如果在linux下,cmake就会根据CMakeLists.txt产生对应的makefile文件。

 

1. Cmake的基本语法

  • 指令(参数 参数)
  • 指令是大小写无关,参数和变量是大小写相关的

例如:

add_excutable(hello main.cpp hello.cpp)
ADD_EXCUTABLE(hello main.cpp hello.cpp)
  • 变量使用${},但是在IF控制语句中是直接使用变量名 

2. 常用指令

指定最小版本指令---cmake_minimum_required

cmake_minimum_required(VERSION 2.8.3) #指定cmake的最小版本是2.8.3版本

定义工程名---project

project(main) #定义工程名为hello
project(main[c][java])#定义工程名为hello,且支持的语言为c和java

设置变量 ---set

set(SRC main.cpp hello.cpp) #设置SRC变量为main.cpp hello.cpp

link_directories相当于g++编译器中指定头文件中的-i选项

#将/usr/lib/mylibfolder ./lib添加到库文件的搜索路径中
link_directories(/usr/lib/mylibfolder ./lib) 

添加编译参数---add_compile_option

add_compile_option(-std=c++11)#添加编译参数 -std=c++11
add_compile_option(-wall -std=c++11)#添加编译参数 -Wall -std=c++11

编译生成可执行文件---add_executable

语法:
add_executable(目标文件 源文件 源文件)
例子:
add_executable(main main.cpp) #编译main.cpp生成可执行文件main
add_executable(main main.cpp add.cpp) #编译main.cpp add.cpp生成可执行文件main

#也可以用一个变量来表示多个源文件
set(SRC_LIST a.cpp b.cpp c.cpp)
add_executable(${PROJECT_NAME} ${SRC_LIST})
#PROJECT_NAME 是设置的工程工程名称
target_link_libraries(main hello)#将hello动态库添加需要链接的共享库中

3. CMake常用的变量

  • CMAKE_C_FLAGS gcc编译选项

  • CMAKE_CXX_FLAGES g++编译选项

	#在CMAKE_CXX_FLAGES 中选项后追加-std=c++11
	set(CMAKE_CXX_FLAGES ,"${CMAKE_CXX_FLAGES} -std=c++11")
  • CMAKE_BUILD_TYPE 编译类型
#设定编译类型为debug,如果要对项目进行调试,需要将CMAKE_BUILD_TYP设置为Debug类型
set(CMAKE_BUILD_TYPE  Debug);
#设定编译类型为realse
set(CMAKE_BUILD_TYPE  Realse);

4. CMake编译工程

在项目主目录下需要存在一个CMakeLists文件

两种方式设置编译规则:

  • 包含源文件的子文件夹包含CMakeLists.txt文件,主目录的CMakeLists.txt通过add_subdirectory添加子目录即可

  • 包含源文件的子文件夹未包含CMakeLists.txt文件,子目录编译规则体现在主目录的CMakeLists.txt中。

 编译流程

在linux平台下使用CMake构建C/C++工程的流程如下:

  1. 手动编写CmakeLists.txt

  2. 执行cmake PATH 生成Makefile(PATH是CMakeLists.txt所在的目录)

  3. 执行命令make进行编译

5. 构建方式

内部构建(不推荐)

内部构建会在同级目录下产生一堆中间件文件,这些中间文件并不是我们想要的,和工程文件放在一起会显得杂乱无章。

#在当前目录下,编译本目录CMakeLists.txt 生成Makefile和其他文件
cmake .
#执行make指令,生成target
make

外部构建(推荐)

将编译文件和源文件放在不同的目录下

mkdir build
#进入到build文件夹中
cd build
#编译上级目录的CMakeLists.txt,生成Makefile和其他文件
cmake ..
#执行make命令,生成target
make

6.  实战---CMake代码实战

编写 CMakeLists.txt文件使add.c和main.c文件生成main可执行文件

main.cc文件:

#include<iostream>
using namespace std;

int main()
{
    cout<<add(10,20)<<endl;
    return 0;
}

add.hpp文件

#include<iostream>

int add(int x,int y);

add.cc文件

#include<iostream>

int add(int x,int y);

编写需要在源文件下创建CMakeLists.txt文件

CMakeLists.txt文件内容:

cmake_minimum_required(VERSION 2.8.12.2) #最低版本号

project(main)                            #项目名称

set(CMAKE_BUILD_TYPE  Debug);            #设置编译类型为Debug
add_executable(${PROJECT_NAME} main.cc add.cc) #编译文件

接下来再创建一个build目录,并进入build目录并执行 cmake ..  ,那么在build目录下就会产生4个文件,其中包括一个Makefile文件。

 在执行make就会在build目录下生成main文件

猜你喜欢

转载自blog.csdn.net/sjp11/article/details/130058596