cmake 学习笔记

CMake 学习笔记

CMake 是什么

CMake 是一个跨平台的自动化构建系统,使用 CMake 可以简化 C++ 项目的构建,CMake 脚本可以生成 Makefile、Visual Studio 项目和 Xcode 项目等构建文件。

CMake 的优势

CMake 有以下优点:

  • 跨平台:CMake 可以在多个操作系统和编译器下运行。
  • 系统独立性:CMake 可以生成不同构建系统所需的文件,比如 Makefile、MSVC 等。
  • 模块化:CMake 的模块化设计可以管理复杂的构建过程。
  • 配置灵活:可以通过设置不同的变量来定制项目的构建选项。

CMake 的基本用法

CMake 使用 CMakeLists.txt 文件来描述项目的组织结构和各个组件之间的依赖关系。通常情况下,CMakeLists.txt 文件应该放在源代码根目录下。

下面是一个简单的 CMakeLists.txt 文件示例:

cmake_minimum_required(VERSION 3.0)

# 设置项目名称
project(hello)

# 添加可执行文件
add_executable(hello main.cpp)

CMakeLists.txt 文件语法说明

cmake_minimum_required

指定该 CMake 脚本所需的 CMake 最小版本。

project

指定项目名称和项目语言。可以通过后面的参数指定项目语言,比如:

project(hello CXX)

表示该项目使用 C++ 语言。

add_executable

指定可执行文件的名称和源文件列表。例如:

add_executable(hello main.cpp foo.cpp bar.cpp)

表示将 main.cppfoo.cppbar.cpp 编译成名为 hello 的可执行文件。

add_library

指定库文件的名称和源文件列表。例如:

add_library(foo foo.cpp)

表示将 foo.cpp 编译成名为 libfoo.a 的静态库。

target_link_libraries

指定可执行文件或库文件所依赖的库。例如:

target_link_libraries(hello foo)

表示 hello 可执行文件需要链接到 libfoo.a 静态库。

CMake 的高级用法

多目录项目构建

对于大型项目,通常会涉及到多个目录,每个目录都有其自己的 CMakeLists.txt 文件。可以通过 add_subdirectory 命令添加子目录,这样子目录的 CMakeFile.txt 文件就会被包含在主 CMakeLists.txt 文件中,从而实现多个目录的项目构建。

add_subdirectory(foo)
add_subdirectory(bar)

外部依赖包的使用

在项目的 CMakeLists.txt 文件中可以使用 find_package 命令查找外部依赖包。例如,如果我们需要使用 Boost 库,可以写如下的代码:

find_package(Boost REQUIRED COMPONENTS system thread)
include_directories(${Boost_INCLUDE_DIRS})
target_link_libraries(hello ${Boost_LIBRARIES})

构建类型

在 CMake 中,可以通过设置 CMAKE_BUILD_TYPE 变量来指定构建类型。常用的构建类型包括:

  • Debug:调试版本。
  • Release:发布版本。
  • RelWithDebInfo:包含发布版本和调试信息的版本。
  • MinSizeRel:包含发布版本,并优化代码大小的版本。

例如,我们可以在命令行中这样设置:

cmake -DCMAKE_BUILD_TYPE=Release ..

即可指定为 Release 构建类型进行构建。

示例:构建一个 C++ 程序

下面是一个简单的 C++ 程序,我们使用 CMake 来构建该程序。

项目组织结构

假设该项目的组织结构如下:

.
├── CMakeLists.txt
├── include
│   └── hello.h
├── src
│   ├── hello.cpp
│   └── main.cpp
└── README.md

其中,包含了一个头文件 hello.h,两个源文件 hello.cppmain.cpp

编写 CMakeLists.txt

针对该项目的组织结构,我们可以编写如下的 CMakeLists.txt 文件:

cmake_minimum_required(VERSION 3.0)

# 设置项目名称
project(hello)

# 指定 C++ 标准
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)

# 添加头文件
include_directories(include)

# 添加可执行文件
add_executable(hello src/main.cpp src/hello.cpp)

在该文件中,我们指定了项目名称为 hello,并指定了 C++ 标准为 C++11。然后,通过 include_directories 命令添加了头文件所在的目录,在该项目中,头文件都在 include 目录中。最后,通过 add_executable 命令添加了 main.cpphello.cpp,并构建为名为 hello 的可执行文件。

编译和运行

在项目的根目录下,执行以下命令:

mkdir build && cd build
cmake ..
make

执行以上命令即可编译出名为 hello 的可执行文件。可以通过以下命令运行该可执行文件:

./hello

示例:构建一个外部依赖工程

下面以 JSON 静态库为例,说明如何使用 CMake 构建一个外部依赖工程。

下载 JSON 库

JSON 库是一个轻量级的 C++ JSON 解析器 and generator,可以从官方网站下载:https://github.com/nlohmann/json/archive/v3.9.1.tar.gz

下载后解压到一个合适的位置。

添加 CMakeLists.txt

假设解压后的 JSON 库源代码放在 ~/json-3.9.1 目录下,我们在该目录下添加一个 CMakeLists.txt 文件:

cmake_minimum_required(VERSION 3.0)

# 设置项目名称
project(json)

# 添加编译选项
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)

# 设置头文件目录
include_directories(include)

# 添加源文件
set(SOURCES json.hpp)

# 生成库文件
add_library(json STATIC ${SOURCES})

在该文件中,我们指定了项目名称为 json,并指定了 C++ 标准为 C++11,如上面所示。然后,通过 include_directories 命令添加了 JSON 库的头文件所在的目录,在 JSON 库中,头文件都在 include 目录中。最后,通过 add_library 命令添加了 json.hpp 头文件,并构建为名为 json 的静态库。

编译和使用 JSON 库

在 JSON 库源代码目录下创建一个 build 目录,并进入该目录,执行以下命令:

cmake ../
make

执行以上命令,即可编译出名为 libjson.a 的静态库文件。

在你需要使用该库的项目 CMakeLists.txt 文件中,添加以下代码:

# 查找 JSON 库
find_library(JSON_LIB NAMES json PATHS ~/json-3.9.1/build)

# 添加链接库
target_link_libraries(your_target_name ${JSON_LIB})

其中,your_target_name 为你的目标名称。这样就可以在你的项目中使用 JSON 库了。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:cmake 学习笔记 - Python技术站

(0)
上一篇 2023年5月23日
下一篇 2023年5月23日

相关文章

  • Golang哈希算法实现配置文件的监控功能详解

    Golang哈希算法实现配置文件的监控功能详解 介绍 在开发中,经常需要读取配置文件来动态调整运行时参数。为了及时更新配置文件的修改,我们需要实现一个能够监控配置文件变化并自动加载的功能。本文介绍使用 Golang 哈希算法实现配置文件监控的方法。 哈希算法介绍 哈希算法是一种将任意长的消息压缩到某一固定长度的消息摘要的函数。摘要的意义在于保证数据的完整性,…

    C 2023年5月23日
    00
  • win10专业版提示更新错误0xC1900101怎么办 0xC1900101错误提示大全

    win10专业版提示更新错误0xC1900101怎么办 如果你正在使用win10专业版并且在更新系统时遇到了错误0xC1900101,那么以下几个方案可能对你有帮助: 方案一:检查硬件兼容性 在开始进行更新之前,请先确认你的设备硬件是否符合win10系统的要求。你可以通过访问微软的设备兼容性中心来检查是否存在不兼容的硬件或软件。 如果你在更新之前没有进行检查…

    C 2023年5月23日
    00
  • VS2015怎么解决scanf函数的C4996错误?

    当使用VS2015进行C\C++编程时,scanf函数会报C4996错误,这是由于scanf函数被认为是不安全的函数而导致的。要解决这个问题,我们需要用安全的scanf_s函数,以下是解决方案的详细步骤。 Step 1: 打开VS2015编译器 Step 2: 新建一个C或C++项目 Step 3: 在代码中,找到scanf函数的相应位置 示例1: #inc…

    C 2023年5月23日
    00
  • C++成员函数如何当作回调函数同时传递this指针

    要将一个C++对象的成员函数作为回调函数并传递对象的this指针,需要使用函数对象和函数指针的技巧。下面分步骤介绍: 1. 定义函数对象 首先定义一个函数对象类,这个类中定义了一个成员函数指针和一个指向对象的指针。这个类将被用于封装成员函数以便传递给其他函数。 class Foo { public: typedef void (Foo::*Callback)…

    C 2023年5月23日
    00
  • android SQLite数据库总结

    Android SQLite数据库总结 简介 SQLite是Android系统提供的一种嵌入式数据库,其主要用途是存储手机应用程序或者游戏中的数据。SQLite是一个轻量级的数据库,它将数据存储在本地文件中,而不是像其他数据库管理系统(DBMS)一样运行在服务器上。本篇文章将会详细介绍SQLite数据库的使用方法,以及常用的CRUD操作。 SQLite基本概…

    C 2023年5月23日
    00
  • C语言实现歌手比赛系统

    C语言实现歌手比赛系统 系统概述 歌手比赛系统是一款使用C语言实现的命令行程序,旨在为歌手比赛场次提供后台管理功能。该系统可以添加、删除、修改歌手信息,查询歌手列表和评分,并且可以实现对歌手评分的计算和排名。 实现步骤 步骤一:创建数据结构 首先需要定义一个数据结构来存储歌手的信息,数据结构可以用结构体来进行描述。以下是一个示例结构体: typedef st…

    C 2023年5月23日
    00
  • VC程序设计小技巧20例

    “VC程序设计小技巧20例”完整攻略 简介 VC程序设计小技巧20例是VC++程序设计中常用的技巧总结,适合于从事VC++开发者,主要包括优化技巧、调试技巧、安全技巧等。以下是详细的攻略总结。 1. 使用switch代替if语句 if语句在判断多个变量时效率低下,可以使用switch代替,代码如下: char c; cin >> c; switc…

    C 2023年5月23日
    00
  • C语言如何实现成绩等级判别

    下面是完整的攻略,希望能对你有所帮助。 C语言如何实现成绩等级判别 了解问题 在实现成绩等级判别之前,我们首先要了解这个问题的背景和具体的需求。这个问题一般出现在学生的成绩管理、考试分析等场景中,需要将学生的成绩按照一定的规则进行等级划分,以便对学生的学习情况进行分析和管理。 设计思路 在进行成绩等级判别的过程中,我们需要依据一定的成绩划分规则来进行计算。一…

    C 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部