关于c++:C编译cmake简明教程

80次阅读

共计 1818 个字符,预计需要花费 5 分钟才能阅读完成。

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 ++11
set(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.a
add_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 build
cd 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

然而可怜的是,这个程序并不能正确执行,因为外面有一些内存泄露的问题,在下一篇文章中将会介绍如何利用一些工具来定位内存泄露问题。

正文完
 0