1.CMake介绍
CMake是一个管理源代码构建的工具。最初,CMake被设计为各种语言的生成器,今天CMake生成现代构建系统,以及用于IDE的项目文件,如Visual Studio和Xcode。
CMake广泛用于C和C++语言,但它也可用于构建其他语言的源代码。
第一次遇到CMake的人可能有不同的初始目标。要了解如何构建从 Internet 下载的源代码包,请从用户交互指南开始。这将详细说明运行 cmake(1) 或 cmake-gui(1) 可执行文件所需的步骤, 以及如何选择生成器, 以及如何完成构建。
使用 依赖项指南面向希望开始使用第三方库的开发人员。
对于使用 CMake 启动项目的开发人员来说,CMake 教程是一个合适的起点。cmake-buildsystem(7) 手册旨在让开发人员扩展他们维护构建系统的知识,并熟悉可以在 CMake 中表示的构建目标。cmake-packages(7) 手册解释了如何创建可由第三方基于 CMake 的构建系统轻松使用的软件包。
以上信息均可在Cmake官网上查询得到,就不多做解释,下面直接开始实例演示。
2.CMakeLists.txt
在实例前,我们需要编写一个叫做CMakeLists.txt的文件,通过它来指定需要编译的文件和库等.
为了规范化工程,按下面目录创建一个src文件夹来存放源代码,创建一个build文件夹来存放生成的Makefile文件等.
工程下的文件树如下:
tree -L 2
.
├── build
├── CMakeLists.txt
└── src
└── test.cpp
2 directories, 2 files
CMakeLists.txt内容如下:
#指定运行的CMake最低版本号,可通过cmake --version查看当前版本
cmake_minimum_required(VERSION 3.10)
#设置工程名
project(firstapp)
#设置编译后的可执行程序名
add_executable(firstapp src/test.cpp)
src/test.cpp
#include <iostream>
using namespace std;
int main()
{
cout << "test!\n";
return 0;
}
接下来进入build目录下
cd build;cmake ../;cmake --build .
发现目录下生成了
tree -L 2
.
├── build
│ ├── CMakeCache.txt
│ ├── CMakeFiles
│ ├── cmake_install.cmake
│ ├── firstapp
│ └── Makefile
├── CMakeLists.txt
└── src
└── test.cpp
运行其中的firstapp,出现
~/CMake/build$ ./firstapp
test!
至此,一个简单的CMake工程已经完成,可以看到CMake比起Makefile更加的便捷和现代化.学会了之后再也不想自己写Makefile了.
当然,上面的例子过于简单,展示不出CMake的用武之地,因此我们继续增加新的功能
1.添加版本号和配置的头文件
我们将添加的第一个功能是为我们的可执行文件和项目提供版本号。虽然我们可以在源代码中专门执行此操作,但使用CmakeLists.txt提供了更大的灵活性。
首先,修改文件以使用 project() 命令设置项目名称和版本号。
CMakeLists.txt文件内容如下:
#指定运行的CMake最低版本号,可通过cmake --version查看当前版本
cmake_minimum_required(VERSION 3.10)
#设置工程名
project(Firstapp VERSION 1.0)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)
#设置编译后的可执行程序名
add_executable(Firstapp ./src/test.cpp)
#指定C++标准
#配置头文件以将版本号传递给源代码
configure_file(${CMAKE_SOURCE_DIR}/Config/testConfig.h.in ${CMAKE_SOURCE_DIR}/include/testConfig.h)
#由于配置文件将被写入二叉树,因此我们必须将该目录添加到路径列表中以搜索包含文件。
#将以下行添加到文件末尾
target_include_directories(Firstapp PUBLIC "${CMAKE_SOURCE_DIR}")
target_include_directories(Firstapp PUBLIC "${CMAKE_SOURCE_DIR}/include")
在CMakeLists.txt同级目录下创建一个Config文件夹,并创建一个testConfig.h.in文件,用来存放生成的配置文件.testConfig.h.in文件内容如下:
#define FIRSTAPP_VERSION_MAJOR @Firstapp_VERSION_MAJOR@
#define FIRSTAPP_VERSION_MINOR @Firstapp_VERSION_MINOR@
//test.h
#ifndef __TEST_H__
#define __TEST_H__
#include <iostream>
#endif
//test.cpp
#include "testConfig.h"
#include "test.h"
int main(int argc,char **argv)
{
if (argc < 2) {
// report version
std::cout << argv[0] << " Version " << FIRSTAPP_VERSION_MAJOR << "."
<< FIRSTAPP_VERSION_MINOR << std::endl;
std::cout << "Usage: " << argv[0] << " number" << std::endl;
return 1;
}
const double inputValue = std::stod(argv[1]);
std::cout << inputValue <<std::endl;
return 0;
}
编译,运行程序后,出现./Firstapp Version 1.0打印.说明版本号添加成功.