Cmake入门(一文读懂)

目录

    • 1、Cmake简介
    • 2、安装CMake
    • 3、单目录简单实例
      • 3.1、CMakeLists.txt
      • 3.2、构建bulid
        • 内部构建
        • 外部构建
      • 3.3、运行C语言程序
    • 4、多目录文件简单实例
      • 4.1、根目录CMakeLists.txt
      • 4.2、源文件目录
      • 4.3、utils.h
      • 4.4、创建build
    • 5、链接外部库文件
    • 6、注意

1、Cmake简介

  CMake是一个强大的跨平台构建工具,它能够自动生成用于构建项目的Makefile、Visual Studio项目文件或其他构建系统所需的文件。使用CMake,可以更轻松地管理复杂的C语言项目,使它们易于维护和跨平台。
  如果对Makefile不了解可以看此文章→Makefile入门

2、安装CMake

  首先,需要安装CMake。在Linux设备可以使用sudo apt-get install cmake。或者从CMake官网下载适合操作系统的安装程序。安装完成后,可以在终端中运行以下命令来检查CMake是否安装成功:

cmake --version

  如果成功安装,将看到CMake的版本信息。

3、单目录简单实例

  cmake的核心就是CMakeLists.txt文件,(注意:CMakeLists.txt文件名严格区分大小写,确保文件名准确无误)告诉CMake如何构建项目。一个工程目录下最简单需要编写一个CMakeLists.txt文件,然后创建build文件在此文件内进行 cmake . . && make编译此工程。如果多级目录,也可以使用多级CMakeLists.txt用于分开管理。以下是一个简单的示例:
在这里插入图片描述

3.1、CMakeLists.txt

cmake_minimum_required(VERSION 3.16)
PROJECT (MyCProject)
# 设置编译选项,加入-g可以gdb调试
SET(CMAKE_CXX_FLAGS "-g")
SET(CMAKE_C_FLAGS "-g")
# 添加源文件
file(GLOB SOURCES "src/*.c")
# 添加头文件目录
#INCLUDE_DIRECTORIES(../include)
# 生成可执行文件
add_executable(src ${SOURCES})

  以上的CMakeLists.txt文件做了以下事情:

  • CMakeLists.txt不区分函数名字大小写,一般一个函数都用大写或者都用小写
  • #号用于注释语句
  • 指定CMake的最低版本。
  • 定义项目名称。
  • 设置C语言标准。
  • 使用file()函数将所有在src/目录下的.c文件赋给变量SOURCES
  • 使用include_directories()函数添加头文件目录。
  • 链接库文件路径LINK_LIBRARIES(xxx.a xx.a xxxx.a xxxxxx.so)
  • 链接库文件LINK_DIRECTORIES(…/lib/csf …/build/certaut_zj …/build/xxx.a …/build/xxx.so)
  • 最后,使用add_executable()函数生成可执行文件,将源文件${SOURCES}执行生成src可执行程序。
  • 此外还可以生成库文件 ADD_LIBRARY(xxx STATIC ${SRC_LIST})生成静态库文件xxx.a
  • 生成动态库 ADD_LIBRARY(xxx SHARED ${SRC_LIST})生成动态库文件xxx.so

3.2、构建bulid

内部构建

  直接在项目目录下进行cmake . 和 make ,这会导致出现很多临时文件,很不友好和美观
在这里插入图片描述

外部构建

  在项目根目录 新建build文件 在此文件中进行cmake … 和make,隐藏不不要的临时文件,便于其他操作。
  例如:在项目根目录下创建一个build/文件夹,并在终端中进入该文件夹。然后运行以下命令:

cmake ..

  这将使用根目录中的CMakeLists.txt文件来配置项目。接下来,运行以下命令来编译项目:

make

这将生成可执行文件MyCProject,可以在build/目录下找到它。

3.3、运行C语言程序

  现在,可以在终端中运行的C语言程序:

./src

  C语言程序应该正常运行了。
在这里插入图片描述

4、多目录文件简单实例

在这里插入图片描述

test-2/CMakeLists.txtsrc/CMakeLists.txtmain.cutils.cinclude/utils.hbuild/
  • CMakeLists.txt 是CMake的配置文件,用于告诉CMake如何构建项目。
    -此工程为多个CMakeLists.txt文件,每个CMakeLists.txt文件管理此目录下的源文件,并且上级CMakeLists.txt可以递归管理子目录
  • src/ 包含的C源代码文件。
  • include/ 包含的头文件。
  • build/ 是构建输出目录,用于存放生成的可执行文件和中间文件,可以按照自己的需求删除和手动创建。

4.1、根目录CMakeLists.txt

cmake_minimum_required(VERSION 3.16)PROJECT (ZPJ_TEST_1)SET(CMAKE_CXX_FLAGS "-g")
SET(CMAKE_C_FLAGS "-g")ADD_SUBDIRECTORY(./src ./bin)

ADD_SUBDIRECTORY(./src ./bin)
将src路径下的CMakeLists.txt进行处理,并且将处理的结果放在bin下,如果是在build目录下cmake的,那么结果就会在build/bin/下
此语句可指定子目录的 相对路径或绝对路径,可省略bin文件,默认生成子目录同名文件放入生成的文件

4.2、源文件目录

CMakeLists.txt

cmake_minimum_required(VERSION 3.16)file(GLOB SRC_LIST "./*.c")
include_directories(../include)ADD_EXECUTABLE(src ${SRC_LIST})

src/main.c

#include <stdio.h>
#include "utils.h"int main() {printf("Hello, CMake!\n");int result = add(2, 3);printf("2 + 3 = %d\n", result);return 0;
}

src/utils.c

#include "utils.h"int add(int a, int b) {return a + b;
}

4.3、utils.h

#ifndef UTILS_H
#define UTILS_Hint add(int a, int b);#endif

4.4、创建build

  运行cmake … 和 make命令,将成功构建多文件C语言项目。
在这里插入图片描述

5、链接外部库文件

把上述例子目录结构改变为
在这里插入图片描述
然后更改每个CMakeLists.txt文件
按上图顺序依次为
根目录

cmake_minimum_required(VERSION 3.16)PROJECT (ZPJ_TEST_1)SET(CMAKE_CXX_FLAGS "-g")
SET(CMAKE_C_FLAGS "-g")ADD_SUBDIRECTORY(./utils/ ./utils/)
ADD_SUBDIRECTORY(./src ./bin)

src

cmake_minimum_required(VERSION 3.16)file(GLOB SRC_LIST "./*.c")
include_directories(../include)
LINK_DIRECTORIES( ../build/utils)
LINK_LIBRARIES(utils.so)
ADD_EXECUTABLE(src ${SRC_LIST})

utils

cmake_minimum_required(VERSION 3.16)file(GLOB SRC_LIST "./*.c")
include_directories(../include)ADD_LIBRARY(utils SHARED ${SRC_LIST})

此为删减版build目录结构
在这里插入图片描述
最后运行src
在这里插入图片描述

6、注意

  不一定每个目录里都要有CMakeLists.txt文件,只要CMakeLists.txt里的各个路径引用正确即可

  CMakeLists.txt中还有许多函数和宏,在大型项目组十分常见,可以自行查找,本文不再加以赘述。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/101096.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于Hata模型的BPSK调制信号小区覆盖模拟matlab完整程序分享

基于Hata信道模型的BPSK调制信号小区覆盖模拟matlab仿真&#xff0c;对比VoIP, Live Video,FTP/Email 完整程序&#xff1a; clc; clear; close all; warning off; addpath(genpath(pwd)); % Random bits are generated here. bits randi([0, 1], [50,1]); M 2; t 1:1:50; …

sqlserver 查询数据显示行号

查询的数据需要增加一个行号 SELECT ROW_NUMBER() OVER(ORDER BY witd_wages_area ,witd_wages_type ,witd_department_id ,witd_give_out_time) 行号,ISNULL(witd_wages_area, 0) witd_wages_area ,witd_wages_type ,witd_department_id ,ISNULL(CONVERT(VARCHAR(7), witd_gi…

Json“牵手”当当网商品详情数据方法,当当商品详情API接口,当当API申请指南

当当网是知名的综合性网上购物商城&#xff0c;由国内著名出版机构科文公司、美国老虎基金、美国IDG集团、卢森堡剑桥集团、亚洲创业投资基金&#xff08;原名软银中国创业基金&#xff09;共同投资成立1。 当当网从1999年11月正式开通&#xff0c;已从早期的网上卖书拓展到网…

函数式接口:Java 中的函数式编程利器

文章目录 1. 函数式接口概念2. 注解3. 自定义函数式接口4. 函数式编程4.1 Lambda的延迟执行效果4.2 使用Lambda作为参数和返回值作为参数使用作为返回值使用 5. 常用的函数接口5.1 Supplier&#xff1a;生产者5.2 Consumer&#xff1a;消费者5.3 Predicate&#xff1a;判断5.4 …

薅羊毛零撸小游戏是这样赚米的!

薅羊毛小游戏作为一种特殊类型的游戏&#xff0c;吸引了一大批用户的关注。本文将探讨薅羊毛小游戏的盈利模式、用户体验以及对游戏产业的影响&#xff0c;旨在为读者提供专业而有深度的思考和启示。 一、薅羊毛小游戏的盈利模式&#xff1a; 1.广告变现&#xff1a;薅羊毛小游…

PageHelper分页原理解析

大家好&#xff0c;我是Leo! 今天给大家带来的是关于PageHelper原理的解析&#xff0c;最近遇到一个SQL优化的问题&#xff0c;顺便研究了一下PageHelper的原理&#xff0c;毕竟也是比较常用&#xff0c;源码也比较好看的懂&#xff0c;如果感兴趣的小伙伴可以跟着过程去DEBUG源…

直播倒计时 1 天|SOFAChannel#35《SOFABoot 4.0 — 迈向 JDK 17 新时代》

&#x1f64c; SOFAChannel#35 直播倒计时 1 天&#xff01; 直播预约 1. 视频号 SOFAGirl 直播 ⬇️点击一键预约⬇️ 2. 添加 SOFAGirl 微信 加入 SOFAChannel 技术交流群 3. 钉钉搜索&#xff1a;44858463 钉钉群同步直播&#xff0c;讲师在线答疑 4. 扫描&#x1f447;下方…

一款内网信息收集利用工具

FuckDomainMini 简介 这是一款基于java开发Windows的内网信息收集、利用工具 可以节省您的信息收集所花费的&#xff0c;又或者是做免杀所花费的时间 现在这个版本是先行版本&#xff0c;目前先行版只有一个功能&#xff0c;更多的功能还在调试与开发中。 尽情期待&#x…

JVM学习(一)--程序计数器

作用&#xff1a;记住下一个jvm指令的执行地址 每一行java源代码&#xff0c;会被编译为多行jvm指令&#xff0c;上文所说的执行地址就是这里的0,3,4等 &#xff0c;由于执行访问特别频繁&#xff0c;程序计数器的底层是有寄存器来实现的 特点&#xff1a; 线程私有&#xff…

层次分析法(matlab实现)

1.层次分析法&#xff08;AHP&#xff09; 在决策理论中&#xff0c;层次分析法是一种以数学和心理学为基础&#xff0c;组织和分析复杂决策的结构化技术&#xff0c;它代表了一种量化决策标准权重的准确方法&#xff0c;通过成对比较&#xff0c;利用个别专家的经验来估计因素…

带纽扣电池产品出口澳洲安全标准,纽扣电池IEC 60086认证

澳大利亚政府公布了《消费品&#xff08;纽扣/硬币电池&#xff09;安全标准》和《消费品&#xff08;纽扣/硬币电池&#xff09;信息标准》。届时出口纽扣/硬币电池以及含有纽扣/硬币电池产品到澳大利亚的供应商&#xff0c;必须遵守这些标准中的要求。 一、 安全标准及信息标…

从零开始学习 Java:简单易懂的入门指南之泛型及set集合(二十二)

泛型及set集合扩展 1.泛型1.1泛型概述 2.Set集合2.1Set集合概述和特点【应用】2.2Set集合的使用【应用】 3.TreeSet集合3.1TreeSet集合概述和特点【应用】3.2TreeSet集合基本使用【应用】3.3自然排序Comparable的使用【应用】3.4比较器排序Comparator的使用【应用】3.5两种比较…