cmake简介
CMake 是一个开源、跨平台的工具系列,旨在构建、测试和打包软件。CMake 用于应用简略的平台和编译器独立配置文件来控制软件编译过程,并生成可在您抉择的编译器环境中应用的本机 makefile和工作区。
cmake 存在的意义
在介绍g++/gcc原理的文章中C++编译原理,咱们用一个简略的例子解说了C++编译的原理,以及g++的应用。对于生成可执行文件这项工作,咱们须要蕴含相应的头文件,以确保咱们写的源代码文件能够顺利的被编译为二进制文件。对于在代码中应用的,定义在其余库的函数和变量,咱们须要通过链接,将其具体的二进制内容,退出到可执行文件中(动静库是运行时加载),这样可执行文件能力顺利执行。
然而对于大型项目来说,为了可读性和可维护性,源代码文件往往依据性能扩散在不同层级的不同目录下,须要的第三方库和第三方头文件也是十分多的。这种状况下,如果间接用g++命令来进行我的项目构建,无疑是十分麻烦的。兴许一些老手会说能够应用MakeFile,但其实MakeFile其实就是将g++命令对应的脚本文件。
cmake的呈现就是为了帮忙构建这种大型简单我的项目。cmake为咱们提供了简洁的接口,不便咱们设置编译参数(如优化等级,报警设置等等),增加依赖(头文件和库),编译源代码等等。
须要留神的是cmake的工作并不是构建我的项目,而是生成构建我的项目的g++命令(更确切的来说就是MakeFile)。
cmake的一个简略的例子
例子的源代码在这里cmake例子。例子的目录构造如下:
.├── CMakeLists.txt├── include│ └── header.h├── library├── main.cpp└── src ├── add │ └── add.cpp ├── distinct │ └── distinct.cpp └── printer.cpp
CMakeLists.txt的内容如下:
# cmake 最低版本需要cmake_minimum_required(VERSION 3.10)# 工程名称project(leak_example)# 设置编译规范为C++11set(CMAKE_CXX_STANDARD "11")# 设置编译动态库的产出目录为我的项目根目录下的library文件夹set(LIBRARY_OUTPUT_PATH ${CMAKE_SOURCE_DIR}/library/)# 设置编译可执行文件的产出目录为我的项目根目录下set(EXECUTABLE_OUTPUT_PATH ${CMAKE_SOURCE_DIR}/)# 设置蕴含头文件门路include_directories(include/)# 编译源码生成指标# 寻找src目录下所有的cpp文件(源代码文件)file(GLOB_RECURSE SRC_LIST src/*.cpp)# 将src目录下的cpp文件编译为动态库libcommon.aadd_library(common STATIC ${SRC_LIST})# 设置链接库目录link_directories(${CMAKE_SOURCE_DIR}/library/)# 将main.cpp编译为可执行文件add_executable(main main.cpp)# 减少可执行文件须要链接的动态库。肯定要放在add_executable前面,否则cmake会对main产生困惑。add_executable相当于申明了可执行文件main的存在。target_link_libraries(main libcommon.a)
构建我的项目时,顺次执行以下命令:
mkdir buildcd build && cmake ..
此时,就能够在build文件夹下看到MakeFile文件了,cmake也就正式实现了它的使命,接着执行make,就能够看到上面的目录构造,主文件曾经呈现了可执行文件main和生成的动态库libcommon.a:
├── CMakeLists.txt├── include│ └── header.h├── library│ └── libcommon.a├── main├── main.cpp└── src ├── add │ └── add.cpp ├── distinct │ └── distinct.cpp └── printer.cpp
然而可怜的是,这个程序并不能正确执行,因为外面有一些内存泄露的问题,在下一篇文章中将会介绍如何利用一些工具来定位内存泄露问题。