一、Cmake简介

CMake是一种跨平台编译工具,CMake主要是编写CMakeLists.txt文件,然后通过cmake命令将CMakeLists.txt文件转化为make所需要的Makefile文件,最后用make命令编译源码生成可执行程序或者库文件。实际项目中的C/C++文件不计其数、文件放置的位置也不同,Makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作。实现自动化的编译。

编译流程:编写CMakeLists.txt → cmake命令,获得Makefile文件 → make命令,生成可执行程序或库文件。

二、CMake链接使用库文件

以简单的例子来来看看CMake的语法,创建一个test项目,项目结构如下
├── test目录
│ ├── CMakeLists.txt
│ ├── include目录
│ │ ├── myprint.h
│ ├── src 目录
│ │ ├── myprint.cpp
│ ├── lib目录
│ ├── biuld目录
include目录放置头文件,src目录下放置的是.c/.cpp源文件,biuld目录是用来构建的项目,lib目录用来放置我们生成库文件。

假设我们要链接到lib目录下的库文件libmyprint.so,CMakeLists.txt文件内容这样写:

  1. #指定 cmake 的最小版本
  2. CMAKE_MINIMUM_REQUIRED(VERSION 3.14)
  3. #指定项目名称,这里源文件是hello.cpp
  4. PROJECT(HELLO)
  5. #将hello.cpp 赋值给SOURCE 变量
  6. SET(SOURCE ${PROJECT_SOURCE_DIR}/src/hello.cpp)
  7. #指定头文件目录
  8. INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/include)
  9. #指定链接库文件目录
  10. LINK_DIRECTORIES(${PROJECT_SOURCE_DIR}/lib)
  11. #将hello.cpp生成可执行文件hello
  12. ADD_EXECUTABLE(hello ${SOURCE})
  13. #指定hello 链接库myprint
  14. TARGET_LINK_LIBRARIES(hello myprint)

cd到项目biuld目录执行cmake ..命令,将会在biuld目录下生成Makefile文件,执行make命令,编译完后,将在biuld目录下生成可执行文件hello。执行./hello 运行程序。
注意:要将 cmake 配置到环境变量中去才可直接使用,否则需要使用绝对路径,.. 表示上一级目录,cmake 会在上一级目录下找到 CMakeLists.txt 文件并编译。

为什么要使用 build 文件夹?
一般我们采用 cmake 的 out-of-source 方式来构建(即生成的中间产物和源代码分离),这样做可以让生成的文件和源文件不会弄混,且目录结构看起来也会清晰明了,所以推荐使用这种方式。至于这个文件夹的命名并无限制,我们习惯命名为 build。

参考
CMakeList语法知识