【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
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
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++工程的流程如下:
-
手动编写CmakeLists.txt
-
执行cmake PATH 生成Makefile(PATH是CMakeLists.txt所在的目录)
-
执行命令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文件