关注微信公众号“池边小树”~~获取更多分析~~(文末二维码~~)
1 CMake简介
在程序开发过程中,我们要用到许许多多的第三方库,这些第三方库往往需要CMake编译成当前系统对应的工程。
CMake是一个构建C++代码的跨平台工具。它能够搜索你的平台环境,然后生成平台上用于Build的文件。在Windows上安装了Visual Studio,它就能够帮助你生成.sln和.vcxproj文件。如果在Linux上,能够帮助你生成Makefile文件。在MAC OS上,能够帮助你生成xcode项目文件。利用这些文件,就可以在本地编译、链接文件。生成这些项目,solution文件的输入信息,就是一套自己编写的和平台无关的配置文件,一般使用CMakeLists.txt文件。(此处我们仅总结在Windows上的使用)
1.1 CMake的下载及安装
(1)下载
官网下载地址:https://cmake.org/download/
下载.Zip文件即可,本文下载的是v3.12.4版本。(若需要该版本,也可在 https://download.csdn.net/download/xingyuzhengtu/10818412上下载),如下图。
(2)解压
下载后直接解压,在解压后文件目录的bin目录下,可以看到cmake.exe。如下图。
(3)设置环境变量
在“计算机-属性-高级系统属性-高级-环境变量”中,将解压后的bin目录的路径添加到Path系统变量中。
1.2 CMake使用
下面通过一个简单的HelloWorld的程序讲解CMake命令行的简单使用。
(1)编写一个Hello World程序,凡在Main.cpp中
#include <iostream>
using namespace std;
int main() {
cout<<"Hello World"<<endl;
return 0;
}
(2)编写一个CMakeLists.txt文件,放在CPP文件的同目录下(项目CPP源文件的根目录)
cmake_minimum_required (VERSION 2.6)
project (HelloWorld)
add_executable (HelloWorld Main.cpp)
如下图
(3)运行CMake
打开一个命令行,到CMakeLists.txt所在路径下,输入下面命令(注意有个“.”)
make .
输出一下结果:
在CMakeLists.txt所在路径下生产了工程文件,如下图
接下来就可以通过VS来生成项目了。
1.3 CMake-gui.exe的使用
CMake还为Windows开发者提供了界面版的小工具。具体的用法如下:
(1)双击打开cmake-gui.exe,选择源代码路径和要生成目标路径
其中,
- “Where is source code”行的Browser Source,加载源码所在目录。
- “Where to build the binarys行的Browser Build,加载源码所在目录下的build目录,生成了项目文件就在这里”
(2)点击configure,选择要生成的项目类型
(3)点击Generate完成生成。
2 CMakeLists.txt文件
在这里只对CMakeLists.txt文件进行简单介绍,详细教程参考官方教程:https://cmake.org/cmake-tutorial/
2.1 单个源文件的编译
如果你的项目只有一个源文件main.cpp,那么只需要在同一个目录下新建一个名为CMakeLists.txt的文件,并添加下面的两行代码即可。
cmake_minimum_required(VERSION 2.8)
add_executable(Main main.cpp)
如果需要添加编译选项,可以通过下面的方法:
cmake_minimum_required(VERSION 2.8)
add_definitions("-Wall -std=c++11") # <= 新增的编译选项
add_executable(Main main.cpp)
2.2 单目录多源文件的编译
假设一个项目中有3个文件,如下图。
代码如下:
//------------------------fun1.CPP
#include <iostream>
using namespace std;
void fun1()
{
cout<<"fun1"<<endl;
}
//------------------------fun2.CPP
#include <iostream>
using namespace std;
void fun2()
{
cout<<"fun2"<<endl;
}
//------------------------Main.CPP
#include <iostream>
using namespace std;
void fun1();
void fun2();
int main()
{
fun1();
fun2();
cout<<"Hello World"<<endl;
return 0;
}
CMakeLists.txt文件内容:
cmake_minimum_required(VERSION 2.8)
project(HelloWorld1)
add_executable(Main
Main.cpp
fun1.cpp
fun2.cpp
)
2.3 多目录程序的编译
假设文件结构如下图所示,其中fun1目录中包含一个fun1.CPP,fun2目录中包含一个fun2.CPP文件。
(1)方法一---整个项目仅编写单个CMakeLists.txt文件
CMakeLists.txt文件内容如下:
cmake_minimum_required(VERSION 2.8)
project(HelloWorld1)
add_executable(Main
Main.cpp
fun1/fun1.cpp
fun2/fun2.cpp
)
(2)方法二--每个目录编写一个CMakeLists.txt文件
CMakeLists.txt文件内容如下:
#fun1/CMakeLists.txt
cmake_minimum_required(VERSION 2.8)
add_library(Fun1 STATIC
fun1.cpp
)
#fun2/CMakeLists.txt
cmake_minimum_required(VERSION 2.8)
add_library(Fun2 STATIC
fun2.cpp
)
cmake_minimum_required(VERSION 2.8)
project(HelloWorld1)
add_subdirectory(Fun1)
add_subdirectory(Fun2)
add_executable(Main Main.cpp)
target_link_libraries(Main Fun1 Fun2)
直接在Main.cpp所在目录执行“cmake .”即可。
参考:
[1] https://blog.csdn.net/liyuebit/article/details/77092723 <windows 下cmake的安装+使用 教程>
[2] https://blog.csdn.net/zhangyiant/article/details/51289404 <cmake在Windows上的使用>
[3] https://blog.csdn.net/gg_18826075157/article/details/72780431 <【C/C++】从零开始的cmake教程>