返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >从零学习cmake构建系统
  • 797
分享到

从零学习cmake构建系统

cmake构建系统cmake从零学习 2023-02-07 12:02:12 797人浏览 薄情痞子
摘要

目录什么是cmake入门实践构建单个源文件同一个目录,多个源文件多个目录多个源文件自定义编译选项最后什么是cmake 根据其官网的定义,cmake是一个开源跨平台的,用于构建、测试

什么是cmake

根据其官网的定义,cmake是一个开源跨平台的,用于构建、测试和打包软件的一个套件工具。与cmake相关的几个概念需要明晰,如GCC,make和makefile。

  • GCC:GCC是GNU Compiler Collection(就是GNU编译器套件),也可以简单认为是编译器,它可以编译很多种编程语言(括C、c++、Objective-C、Fortran、Java等等)
  • make:make工具可以看成是一个智能的批处理工具,它本身并没有编译和链接的功能,而是用类似于批处理的方式通过调用makefile文件中用户指定的命令来进行编译和链接的。
  • makefile,makefile就是GCC命令的集合,make工具就根据makefile中的命令进行编译和链接的
  • cmake,当项目非常大时,手写makefile会非常烦碎,而且不同平台makefile也会不同,所以cmake就是可以根据CMakeLists.txt自动生成makefile。

入门实践

我们已经对于cmake有了一个总体上的认识,接下来就通过官方提供的几个例子介绍下如何使用cmake。

构建单个源文件

项目只有一个源文件,结构如下,我们一般会新建一个目录存储cmake运行的产物,这里我新建了一个build目录。

├── CMakeLists.txt
├── build
└── main.cc

main.cc的内容如下

#include <stdio.h>
#include <stdlib.h>

double power(double base, int exponent)
{
    int result = base;
    int i;
    if (exponent == 0) {
        return 1;
    }
    for(i = 1; i < exponent; ++i){
        result = result * base;
    }
    return result;
}
int main(int argc, char *argv[])
{
    if (argc < 3){
        printf("Usage: %s base exponent \n", argv[0]);
        return 1;
    }
    double base = atof(argv[1]);
    int exponent = atoi(argv[2]);
    double result = power(base, exponent);
    printf("%g ^ %d is %g\n", base, exponent, result);
    return 0;
}

CMakeLists.txt的内容如下:

# Cmake的最低版本号的要求
cmake_minimum_required (VERSION 2.8)
# 项目信息
project (Demo1)
# 指定生成目标
add_executable(Demo main.cc)

在build目录下执行cmake .. 然后执行make命令就可以得到Demo1的可执行文件。

同一个目录,多个源文件

如果我们将Demo1中main.cc的power函数抽取出来放到MathFunctions.cc中,项目结构如下:

├── CMakeLists.txt
├── MathFunctions.cc
├── MathFunctions.h
├── build
└── main.cc

那么该如何编译呢,我们可以通过在add_executable命令中增加将MathFunctions.cc,效果如下add_executable(Demo main.cc MathFunctions.cc),但是如果有很多文件的情况下,一个文件一个文件的添加很麻烦,cmake提供了aux_source_directory命令,该命令会查找指定目录下所有的源文件,然后将结果存到指定的变量名。CMakeLists.txt文件内容如下

# CMake 最低版本号要求
cmake_minimum_required (VERSION 2.8)
# 项目信息
project (Demo2)
# 查找目录下的所有源文件
# 并将名称保存到 DIR_SRCS 变量
aux_source_directory(. DIR_SRCS)
# 指定生成目标
add_executable(Demo ${DIR_SRCS})

多个目录多个源文件

现在我们将MathFounction.h和MathFounction.cpp移动到math目录下,项目结构如下:

├── CMakeLists.txt
├── build
├── main.cc
└── math
    ├── CMakeLists.txt
    ├── MathFunctions.cc
    └── MathFunctions.h

面对这种情况我们需要在Demo3目录下和math目录下各自编写一个CmakeLists.txt文件,我们可以将math目录里面的文件编译成静态库再由main函数调用。 Demo3目录下的CMakeLists.txt内容如下

# CMake 最低版本号要求
cmake_minimum_required (VERSION 2.8)
# 项目信息
project (Demo3)
# 查找目录下的所有源文件
# 并将名称保存到 DIR_SRCS 变量
aux_source_directory(. DIR_SRCS)
# 添加 math 子目录
add_subdirectory(math)
# 指定生成目标
add_executable(Demo ${DIR_SRCS})
# 添加链接库
target_link_libraries(Demo MathFunctions)

add_subdictory(math)指明本项目包含一个子目录math,这样,math目录下的CMakeLists.txt文件和源代码也会被使用,最后一行target_link_libraries指明可执行文件需要链接一个名为MathFunctions的链接库。math目录下CMakeLists.txt内容如下

# 查找当前目录下的所有源文件
# 并将名称保存到 DIR_LIB_SRCS 变量
aux_source_directory(. DIR_LIB_SRCS)
# 指定生成 MathFunctions 链接库
add_library (MathFunctions ${DIR_LIB_SRCS})

该文件中使用命令add_library将src目录中源文件编译为静态链接库

自定义编译选项

CMake允许为项目增加编译选项,从而可以根据用户的环境和要求选择最合适的编译方案,例如可以将MathFunctions库设置为一个可选的库,如果该选项为ON,则使用该库定义的函数来进行运算,否则就调用标准库的数学函数库。 为了实现这样的目的我们需要在顶层的CMakeLists.txt中添加该选项,其内容如下

cmake_minimum_required (VERSION 2.8)
# 项目信息
project (Demo4)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
# 是否使用自己的 MathFunctions 库
option (USE_MYMATH
	   "Use provided math implementation" ON)
# 加入一个配置头文件,用于处理 CMake 对源码的设置
configure_file (
  "${PROJECT_SOURCE_DIR}/config.h.in"
  "${PROJECT_BINARY_DIR}/config.h"
  )
# 是否加入 MathFunctions 库
if (USE_MYMATH)
  include_directories ("${PROJECT_SOURCE_DIR}/math")
  add_subdirectory (math)
  set (EXTRA_LIBS ${EXTRA_LIBS} MathFunctions)
endif (USE_MYMATH)
# 查找当前目录下的所有源文件
# 并将名称保存到 DIR_SRCS 变量
aux_source_directory(. DIR_SRCS)
# 指定生成目标
add_executable (Demo ${DIR_SRCS})
target_link_libraries (Demo  ${EXTRA_LIBS})

其中configure_file命令用于加入一个配置文件config.h,这个文件由CMake从config.h.in生成,通过这样的机制可以通过预定义一些参数和变量来控制代码的生成,config.h.in内容如下:

#cmakedefine USE_MYMATH

其中的option命令添加了一个USE_MYMATH选项,并且默认值为ON。之后根据USE_MYMATH变量的值决定是否使用我门自己编写的MathFounctions库

然后需要更改main.cc文件让其根据USE_MYMATH的值确定是否调用标准库,内容如下:

#include <stdio.h>
#include <stdlib.h>
#include <config.h>
#ifdef USE_MYMATH
  #include <MathFunctions.h>
#else
  #include <math.h>
#endif
int main(int argc, char *argv[])
{
    if (argc < 3){
        printf("Usage: %s base exponent \n", argv[0]);
        return 1;
    }
    double base = atof(argv[1]);
    int exponent = atoi(argv[2]);
#ifdef USE_MYMATH
    printf("Now we use our own Math library. \n");
    double result = power(base, exponent);
#else
    printf("Now we use the standard library. \n");
    double result = pow(base, exponent);
#endif
    printf("%g ^ %d is %g\n", base, exponent, result);
    return 0;
}

值得注意的是这里引入了一个config.h,这个文件预定义了 USE_MYMATH 的值。但我们并不直接编写这个文件,而是由CMake根据config.h.in自动生成。

最后

这篇文章主要介绍了cmake的简单使用,更多关于cmake构建系统的资料请关注编程网其它相关文章!

--结束END--

本文标题: 从零学习cmake构建系统

本文链接: https://lsjlt.com/news/194468.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 从零学习cmake构建系统
    目录什么是cmake入门实践构建单个源文件同一个目录,多个源文件多个目录多个源文件自定义编译选项最后什么是cmake 根据其官网的定义,cmake是一个开源跨平台的,用于构建、测试...
    99+
    2023-02-07
    cmake构建系统 cmake从零学习
  • 从零学习构造系统之bazel示例详解
    目录什么是bazelBazel的基本概念WORKSPACE fileBUILD fileBazel的C++事例单个目标,单个软件包单个软件包,多个目标多个软件包,多个目标最后什么是b...
    99+
    2023-02-07
    bazel构造系统 bazel构造系统从零学习
  • 从零开始学习PHP构建简易网站
    从零开始学习PHP构建简易网站 随着互联网的普及,网站已经成为人们获取信息和交流的重要平台。学习如何构建网站,对于有志于进入Web开发领域的人来说是非常重要的。PHP作为一种流行的服务...
    99+
    2024-04-02
  • 怎么从零学习PostgreSQL Page结构
    这篇文章主要为大家展示了“怎么从零学习PostgreSQL Page结构”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“怎么从零学习PostgreSQL Page结构”这篇文章吧。一、Pagepg...
    99+
    2023-05-31
  • 从零开始学习 GO 语言:UNIX 系统上的学习笔记
    从零开始学习 GO 语言:UNIX 系统上的学习笔记 GO 语言是一门由 Google 开发的高效、现代化的编程语言。它拥有类似 C 语言的语法,同时也具备了现代编程语言所必需的特性,如垃圾回收、并发编程和安全性。本文将介绍如何在 UNIX...
    99+
    2023-10-03
    unix 学习笔记 git
  • cmake跨平台构建工具的学习笔记
    目录前言跨平台开发CMake语法特性CMake重要指令和常用变量重要指令常用变量CMake编译工程编译实战内部构建外部构建小结前言 CMake是一个跨平台的安装编译工具,可以用简单的...
    99+
    2023-02-06
    cmake跨平台开发 cmake构建工程 cmake跨平台构建
  • 从零开始学习Node.js
    目录url模块1.parse 方法2.format 方法3.resolve 方法events模块(事件驱动)path模块总结url模块 1.parse 方法 // test02....
    99+
    2024-04-02
  • 从零开始学习React
    这篇文章主要讲解了“从零开始学习React”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“从零开始学习React”吧!0: 从一次最简单的 React 渲染说...
    99+
    2024-04-02
  • Linux下如何安装构建系统cmake
    这篇文章主要介绍Linux下如何安装构建系统cmake,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!cmake是一个跨平台的开源元构建系统,可以构建、测试和打包软件。它可以用来支持多种本地构建环境,包括make,苹果...
    99+
    2023-06-27
  • 自动化构建系统CMake怎么用
    这篇文章主要为大家展示了“自动化构建系统CMake怎么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“自动化构建系统CMake怎么用”这篇文章吧。CMake 是一个跨平台的自动化构建系统,它使用...
    99+
    2023-06-27
  • 从零开始学习ASP:建议学习HTTP和Apache的经验
    ASP(Active Server Pages)是一种动态网页技术,它可以让开发者在HTML中嵌入服务器脚本代码,从而实现网页的动态交互效果。对于想要学习ASP的初学者来说,建议首先学习HTTP和Apache,这将有助于更好地理解和掌握A...
    99+
    2023-09-17
    http 学习笔记 apache
  • 从零学习node.js之搭建http服务器(二)
    前言 在上篇文章中我们了解了一下不同模块规范之间的联系与区别。本文我们正式开始node的学习,首先我们从搭建一个http服务器,能运行简单的程序开始说起。 一、hello world 最经典的hello ...
    99+
    2022-06-04
    服务器 node js
  • 从零开始的Python学习Episode
    一、输入与输出 1.输入 input("number:") num = input("number:") 下面一段可以把输入的信息存在num中。 注意:输入的信息会被认为是字符串,如果要输入数字进行运算要先把输入的信息进行强制类型转换...
    99+
    2023-01-30
    从零开始 Python Episode
  • 从零开始,如何在 Windows 系统上学习 Apache 并掌握 ASP?
    Apache 是一款流行的 Web 服务器软件,同时也是开源软件中最受欢迎的 Web 服务器之一。在 Windows 系统上学习 Apache 并掌握 ASP,需要以下步骤: 第一步:安装 Apache 在 Windows 系统上安装 Ap...
    99+
    2023-06-20
    apache 学习笔记 windows
  • 从零开始学习PHP实时Git:Windows系统下的实战指南
    在今天的软件开发中,版本控制工具是必不可少的。Git是目前最流行的版本控制工具之一,它可以帮助我们轻松地管理代码库,并且可以方便地与团队成员协作。如果你正在学习PHP编程语言,并想要学习如何使用Git来管理你的代码库,那么这篇文章就是为你...
    99+
    2023-10-26
    实时 git windows
  • 从零开始学习Java编程:使用Apache服务器和Linux系统记录学习笔记
    Java是一种广泛应用于企业级应用程序开发的编程语言。如果你想成为一个优秀的Java开发人员,从零开始学习Java编程是一个必要的过程。在本文中,我们将介绍如何使用Apache服务器和Linux系统记录你的学习笔记,帮助你更好地理解和掌握...
    99+
    2023-11-10
    学习笔记 apache linux
  • 从零开始学习 PHP 并发编程与分布式系统设计
    随着互联网的快速发展,分布式系统的重要性越来越凸显出来。PHP 作为一种高性能的 Web 开发语言,也需要支持并发编程和分布式系统设计。本文将从零开始介绍 PHP 并发编程和分布式系统设计,帮助 PHP 开发人员更好地理解和应用这些技术。...
    99+
    2023-06-16
    并发 面试 分布式
  • 学习笔记:从零开始学习 ASP、Unix 和容器
    在当今数字化时代,学习计算机编程成为越来越多人的选择。ASP、Unix 和容器是三个非常重要的领域,本文将从零开始介绍学习这三个领域的方法和技巧。 一、ASP ASP(Active Server Pages)是微软公司的一种动态网页技术,...
    99+
    2023-08-20
    unix 容器 学习笔记
  • 从零学习node.js之express入门(六)
    一、 介绍 什么是express,为什么要使用express?根据官方网站的说法,express是一个基于 Node.js 平台的极简、灵活的web应用开发框架,它提供一系列强大的特性、丰富的API接口,对...
    99+
    2022-06-04
    入门 node js
  • ChatGPT PHP开发攻略:从零开始构建智能聊天系统
    ChatGPT PHP开发攻略:从零开始构建智能聊天系统引言:随着AI技术的发展和应用的广泛普及,智能聊天系统在各个领域都变得越来越重要。PHP是一种广泛应用于Web开发的服务器端脚本语言,它具有简单易学、灵活和高效的特点,因此非常适合用于...
    99+
    2023-10-25
    ChatGPT PHP开发 智能聊天系统
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作