Cmake入门(一文读懂)

目录

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

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、CMakeLists.txt

  cmake的核心就是CMakeLists.txt文件,(注意:CMakeLists.txt文件名严格区分大小写,确保文件名准确无误)告诉CMake如何构建项目。通过CMakeLists.txt可以决定工程文件生成二进制文件动态库静态库文件,以及链接各种库文件,十分灵活好用,以下几种实例都会讲到。

4、单目录简单实例

  一个工程目录下最简单需要编写一个CMakeLists.txt文件,然后创建build文件在此文件内进行 cmake . . && make编译此工程。如果多级目录,也可以使用多级CMakeLists.txt用于分开管理。以下是一个简单的示例:
在这里插入图片描述

4.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_minimum_required( )指定CMake的最低版本。
  • PROJECT( ) 定义项目名称。
  • SET(CMAKE_CXX_FLAGS “-g”)设置C语言标准,此外set(A B)函数还用于赋值将B赋予A。
  • 使用file()函数将所有在src/目录下的.c文件赋给变量SOURCES
  • 使用include_directories()函数添加头文件目录。
  • 链接库文件路径LINK_LIBRARIES(xxxx.a xxxx.so)
  • 链接库文件LINK_DIRECTORIES(. ./lib/ . ./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

4.2、构建bulid

内部构建

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

外部构建

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

cmake ..

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

make

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

4.3、运行C语言程序

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

./src

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

5、多目录文件简单实例

在这里插入图片描述

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

5.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文件,默认生成子目录同名文件放入生成的文件

5.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;
}

5.3、utils.h

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

5.4、创建build

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

6、生成库文件和链接外部库文件

把上述例子目录结构改变为
在这里插入图片描述
然后更改每个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
在这里插入图片描述

7、注意

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

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

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

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

相关文章

Mysql5.7(Docker环境)实现主从复制

文章目录 前言一、MySQL主从数据库同步如何实现&#xff1f;(理论)1.1 为什么要使用数据库主从1.2 数据库主从实现原理是什么&#xff1f; 二、Docker环境配置MySQL5.7主从(实践)2.1 配置安装Master2.2 配置安装Slave 前言 本文章将以MySQL5.7版本来讲诉MySQL主从复制的原理以…

centos 编译安装的php多版本 切换

centos 编译安装的php多版本 切换 wheris php php: /usr/bin/php /usr/lib64/php /etc/php.ini /etc/php.d /usr/local/php /usr/local/php7.4 /usr/share/php /usr/share/man/man1/php.1.gz/usr/bin/php: php可执行脚本&#xff0c;任何版本的php 通过软连接到这可以实现全局…

STM32CubeMX systick bug?

发觉用新版&#xff08;V6.9.1&#xff09;的它生成代码&#xff0c;会有问题。可能是 BUG。具体如下&#xff1a; 一个简单的点灯程序&#xff0c;用 Keil MDK 5.38a&#xff08;compiler version 6&#xff09;编译。 如果在变量前&#xff0c;不加上关键字“volatile”&am…

VEX —— Functions|Geometry

目录 geoself —— 返回当前几何体的handle addpoint —— 添加点到几何体 addprim —— 添加面到几何体 addvertex —— 添加一顶点到面 minpos —— 查找点离几何体表面最近的位置 nearpoint —— 查找离几何体最近的点 nearpoints —— 查找离几何体所有最近的点 ne…

【计算机网络】UDP数据包是如何在网络中传输的?

List item 创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; 更多计算机网络知识专栏&#xff1a;计算机网络&#x1f525;…

Vue项目使用axios配置请求拦截和响应拦截以及判断请求超时处理提示

哈喽大家好啊&#xff0c;最近做Vue项目看到axios axios官网&#xff1a;起步 | Axios 中文文档 | Axios 中文网 (axios-http.cn)​​​​​​ 重要点&#xff1a; axios是基于Promise封装的 axios能拦截请求和响应 axios能自动转换成json数据 等等 安装&#xff1a; $ npm i…

树莓派搭建K8S集群

最近学习k8s知识&#xff0c;想用树莓派搭建集群&#xff0c;在网找了不少&#xff0c;就发现一篇文章可以搭建成功香橙派4和树莓派4B构建K8S集群实践之一&#xff1a;K8S安装&#xff0c;参考了不少&#xff0c;这里主要记录下遇到的一些问题&#xff0c;参考的文章&#xff0…

入门Python编程:了解计算机语言、Python介绍和开发环境搭建

文章目录 Python入门什么是计算机语言1. 机器语言2. 符号语言&#xff08;汇编&#xff09;3. 高级语言 编译型语言和解释型语言1. 编译型语言2. 解释型语言 Python的介绍Python开发环境搭建Python的交互界面 python学习专栏python基础知识&#xff08;0基础入门&#xff09;py…

C高级 DAY3

一、shell中的变量 shell本身是擅长运行指令&#xff0c;是一种弱数据类型语言 它与c语言中定义变量有所不同 C中&#xff1a; 存储类型 数据类型 变量名;shell中&#xff1a; 变量变量的值 ----->如果变量的值中间没有空格直接使用 变量变量的值 ----->变量…

【uni-app】

准备工作&#xff08;Hbuilder&#xff09; 1.下载hbuilder&#xff0c;插件使用Vue3的uni-app项目 2.需要安装编译器 3.下载微信开发者工具 4.点击运行->微信开发者工具 5.打开微信开发者工具的服务端口 效果图 准备工作&#xff08;VScode&#xff09; 插件 uni-cr…

c++day3

stack.h #ifndef STACK_H #define STACK_H #include <iostream> //#define max 128 using namespace std; class Stack { private:int* stack;//数组指针int top;//栈顶元素int max;//栈容量 public://构造函数Stack();//析构函数~Stack();//定义拷贝构造函数Stack(cons…

Android窗口层级(Window Type)分析

前言 Android的窗口Window分为三种类型&#xff1a; 应用Window&#xff0c;比如Activity、Dialog&#xff1b;子Window&#xff0c;比如PopupWindow&#xff1b;系统Window&#xff0c;比如Toast、系统状态栏、导航栏等等。 应用Window的Z-Ordered最低&#xff0c;就是在系…

matlab如何遍历文件夹及子文件夹下的所有文件

需求 有一个比较深层的文件夹&#xff0c;每个文件夹及其子文件夹下都可能存在我所需要的csv文件&#xff0c;写一个函数&#xff0c;输入文件夹路径后可以返回所有符合要求的csv文件。 代码实现 % folder_path为输入的文件夹&#xff0c;str为指定的文件所特有的关键字&…

Vue导航守卫beforeRouteEnter,beforeRouteUpdate,beforeRouteLeave

Vue导航守卫以我自己的理解就是监听页面进入,修改,和离开的功能。每个守卫接受三个参数 to: Route: 即将要进入的目标路由对象 from: Route: 当前导航正要离开的路由 next: Function: 一定要调用该方法来 resolve 这个钩子。执行效果依赖 next 方法的调用参数。 next(): 进行…

docker运行并进入MySQL容器

1、运行容器 $ docker run -itd --name mysql-test -p 3306:3306 -e MYSQL_ROOT_PASSWORD123456 mysql这是一个使用Docker命令行工具来启动一个MySQL容器的命令。下面&#xff0c;让我们来详细解析这条命令&#xff1a; docker run docker: Docker的命令行工具。 run: Docke…

Codeforces Round 827 (Div. 4) D 1e5+双重for循环技巧

Codeforces Round 827 (Div. 4) D 做题链接&#xff1a;Codeforces Round 827 (Div. 4) 给定一个由 n个正整数 a1,a2,…,an&#xff08;1≤ai≤1000&#xff09;组成的数组。求ij的最大值&#xff0c;使得ai和aj共质&#xff0c;否则−1&#xff0c;如果不存在这样的i&#…

ChatGPT企业版来了,速度翻倍,无使用限制

美国时间8月28日&#xff0c;OpenAI宣布了自ChatGPT推出以来最重大的新闻&#xff1a;将推出ChatGPT企业版&#xff0c;企业版ChatGPT将直接对接GPT-4&#xff0c;提供无限制访问、高级数据分析功能、定制服务等服务&#xff0c;并支持处理更长文本输入的长上下文窗口。 OpenAI…

Jetsonnano B01 笔记3:GPIO上拉下拉-输入输出读取

今日继续我的jetsonnano学习之路&#xff0c;今日学习的是GPIO的上拉下拉&#xff0c;输入输出的读取&#xff0c;文章贴出完整操作步骤过程&#xff0c;贴出源码。 目录 Linux常用文件命令&#xff1a; ls&#xff08;list&#xff09;列表&#xff1a; man&#xff1a; …

页面页脚部分CSS分享

先看效果&#xff1a; CSS部分&#xff1a;&#xff08;查看更多&#xff09; <style>body {display: grid;grid-template-rows: 1fr 10rem auto;grid-template-areas: "main" "." "footer";overflow-x: hidden;background: #F5F7FA;min…

有哪些Linux可以替代centerOS的

有哪些Linux可以替代centerOS的 CentOS是一个非常流行的企业级Linux发行版&#xff0c;但是在2020年12月&#xff0c;CentOS宣布将停止提供长期支持&#xff08;LTS&#xff09;版本&#xff0c;这对于很多企业和用户来说是一个巨大的打击。以下是一些可以替代CentOS的Linux发…