使用 cmake

使用前注意 :

  1. CMake是一种跨平台的构建系统,它用于管理软件构建过程,尤其适合多语言、多配置的项目。CMake不直接构建软件,而是生成特定构建工具(如Makefile或Visual Studio项目)所需的配置文件。

  2. 如果仅仅使用 qt 编程,没有必要使用 cmake,因为 qmake 管理 Qt 工程的专业性和自 动化程度比 cmake 要高很多。

  3. 如果你的工程只有几个文件,直接编写 Makefile 是最好的选择。

套用一个简单的cmake工程

这里不再解释复杂的语法 ,只给出 一个简单的工程, 参考文献 [1]中的demo4 ,

GitHub - ClangWU/CMake_Tutorial: The repositoy which contains 5 demos,elaborates how to write CMAKE in details.

首先是每一个目录 下都要有一个 CMakeLists.txt文件 ;

其次是工程目录运行:

mkdir  build 
cd build
cmake ../
make
cd bin
./demo4 4 2

建立 子目录 build; 进入到 build ;  生成makefile文件 ; 用make 编译 ; 进入生成的可执行文件 目录 ; 运行可执行文件 。

cmake 工程说明

工程根目录下的 CMakeLists.txt文件 ,指定工程名称,并添加2个子目录 :

CMAKE_MINIMUM_REQUIRED(VERSION 3.10)
PROJECT(demo3)
ADD_SUBDIRECTORY(./mylib)
ADD_SUBDIRECTORY(./src)

工程 src 目录下的 CMakeLists.txt文件 ,PROJECT_SOURCE_DIR 指工程代码 所在目录 ,PROJECT_BINARY_DIR 指编译发生的当前目录 。

第1句:头文件目录包含 当前工程所在目录下的 lib目录 ,

第2句:SET 目标二进制保存的目录 为当前工程编译发生的当前目录 下的 bin目录 ,

第3句:用于将指定目录下所有源文件 列表赋值给一个变量 DIR_SRCS,

第4句:基于源文件 生成可执行文件 :demo4, 源文件列表是${DIR_SRCS}

第5句:将目标文件demo4 链接到Mylib:

INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/mylib)
SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
AUX_SOURCE_DIRECTORY(./ DIR_SRCS)
ADD_EXECUTABLE(demo4 ${DIR_SRCS})
TARGET_LINK_LIBRARIES(demo4 Mylib)

工程 lib 目录下的 CMakeLists.txt文件 , 添加库文件目录 ;设置库输出目录 ;定义库文件 的目标文件为 Mylib,  类型为静态库, ${DIR_LIB_SRCS} 为库文件列表 :

AUX_SOURCE_DIRECTORY(. DIR_LIB_SRCS)
SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)
ADD_LIBRARY(Mylib STATIC ${DIR_LIB_SRCS})

用 makefile编写一个工程 模板

参考: Linux应用层开发,makefile万能通用模板_makefile 通用模板-CSDN博客

项目编写一个makefile文件, 通过make编译

1,创建一个项目目录 Linux_base_project

2,在目录中创建一个main.c,和add.c程序。

3,编写一个万能通用makefile文件。

4.看不同makefile里面的一些符号可以搜索对应的语法熟悉一下。

TARGET=main                         //目标文件
SRCS=$(wildcard *.c ./*/*.c)        //通过wildcard 获取当前目录下全部.c文件,递归文件夹,赋值给SRCS变量
OBJS=$(patsubst %.c,%.o,$(SRCS) )   //通过patsubst将全部.c文件,替换为.o赋值OBJSCC=gcc
$(TARGET):$(OBJS)$(CC) -o $(TARGET) $(OBJS)  
%.o:%.c$(CC) -c  $< -o $@          #$@表示目标文件,$<依赖.o.PHONY:clean  echoecho:@echo "source files: $(SRCS)"@echo "object files: $(OBJS)"clean: rm $(OBJS)cleanall: rm $(OBJS) $(TARGET)

文档结构 

好的文档结构 是成功的一半。

doc存放文档;res 资源 ,包括训练的图片;src 源码,config 配置信息,src主程序,modules自己写的模块代码,test测试模块代码的小程序,tool编写的小工具;third_party别人写的第三方库

/project# tree ./
./
├── build
├── doc
├── res
├── src
│   ├── CMakeLists.txt
│   ├── config
│   ├── modules
│   │   ├── CMakeLists.txt
│   │   ├── mymath.cpp
│   │   └── mymath.hpp
│   ├── src
│   │   ├── CMakeLists.txt
│   │   └── main.cpp
│   ├── test
│   └── tool
└── third_party├── libA└── libB

参考文献 :

[1] 【技术】手把手教你写CMake一条龙教程——421施公队Clang出品_哔哩哔哩_bilibili

[2]   cmake使用示例与整理总结-CSDN博客

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

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

相关文章

AI软件外包需要注意什么 外包开发AI软件的关键因素是什么 如何选择AI外包开发语言

1. 定义目标与需求 首先&#xff0c;要明确你希望AI智能体做什么。是自动化任务、数据分析、自然语言处理&#xff0c;还是其他功能&#xff1f;明确目标可以帮助你选择合适的技术和方法。 2. 选择开发平台与工具 开发AI智能体的软件时&#xff0c;你需要选择适合的编程语言、…

学习数据结构(5)单向链表的实现

&#xff08;1&#xff09;头部插入 &#xff08;2&#xff09;尾部删除 &#xff08;3&#xff09;头部删除 &#xff08;4&#xff09;查找 &#xff08;5&#xff09;在指定位置之前插入节点 &#xff08;6&#xff09;在指定位置之后插入节点 &#xff08;7&#xff09;删除…

深入理解MySQL 的 索引

索引是一种用来快速检索数据的一种结构, 索引使用的好不好关系到对应的数据库性能方面, 这篇文章我们就来详细的介绍一下数据库的索引。 1. 页面的大小: B 树索引是一种 Key-Value 结构&#xff0c;通过 Key 可以快速查找到对应的 Value。B 树索引由根页面&#xff08;Root&am…

Vue-cli 脚手架搭建

安装node.js 官网下载node.js安装包&#xff0c;地址&#xff1a;Node.js — Download Node.js 先在node.js即将要安装的路径下创建两个文件夹&#xff1a;node_cache&#xff08;缓存&#xff09;、node_global&#xff08;全局&#xff09; 点击安装包&#xf…

深度解析 DeepSeek R1:强化学习与知识蒸馏的协同力量

DeepSeek-R1 的问世&#xff0c;无疑在 AI 领域激起了千层浪。自发布仅一周&#xff0c;它便凭借卓越的性能和创新的技术&#xff0c;成为 AI 社区热议的焦点&#xff0c;代表着人工智能在推理和理解能力上的重大飞跃。今天我们一起深度解析一下DeepSeek-R1 一、强大基石&…

openssl 生成证书 windows导入证书

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 源码指引&#xff1a;github源…

笔记本搭配显示器

笔记本&#xff1a;2022款拯救者Y9000P&#xff0c;显卡RTX3060&#xff0c;分辨率2560*1600&#xff0c;刷新率&#xff1a;165Hz&#xff0c;无DP1.4口 显示器&#xff1a;2024款R27Q&#xff0c;27存&#xff0c;分辨率2560*1600&#xff0c;刷新率&#xff1a;165Hz &…

在php中怎么打开OpenSSL

&#xff08;点击即可进入聊天助手&#xff09; 背景 在使用php做一些项目时,有用到用户邮箱注册等,需要开启openssl的能力 在php系统中openssl默认是关闭状态的,在一些低版本php系统中,有的甚至需要在服务器终端后台,手动安装 要打开OpenSSL扩展&#xff0c;需要进行以下步骤 …

【单细胞第二节:单细胞示例数据分析-GSE218208】

GSE218208 1.创建Seurat对象 #untar(“GSE218208_RAW.tar”) rm(list ls()) a data.table::fread("GSM6736629_10x-PBMC-1_ds0.1974_CountMatrix.tsv.gz",data.table F) a[1:4,1:4] library(tidyverse) a$alias:gene str_split(a$alias:gene,":",si…

K8S 快速实战

K8S 核心架构原理: 我们已经知道了 K8S 的核心功能:自动化运维管理多个容器化程序。那么 K8S 怎么做到的呢?这里,我们从宏观架构上来学习 K8S 的设计思想。首先看下图: K8S 是属于主从设备模型(Master-Slave 架构),即有 Master 节点负责核心的调度、管理和运维,Slave…

134.力扣刷题--加油站--滑动窗口

你知道的&#xff0c;失败总是贯穿人生的始终。 加油站 在一条环路上有 n 个加油站&#xff0c;其中第 i 个加油站有汽油 gas[i] 升。 你有一辆油箱容量无限的的汽车&#xff0c;从第 i 个加油站开往第 i1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发&#x…

爬虫基础(二)Web网页的基本原理

一、网页的组成 网页由三部分构成&#xff1a;HTML、JavaScript、CSS。 &#xff08;1&#xff09;HTML HTML 相当于网页的骨架&#xff0c;它通过使用标签来定义网页内容的结构。 举个例子&#xff1a; 它把图片标签为img、把视频标签为video&#xff0c;然后组合到一个界面…

Three.js实现3D动态心形与粒子背景的数学与代码映射解析

一、效果概述 本文通过Three.js构建了一个具有科技感的3D场景&#xff0c;主要包含两大视觉元素&#xff1a; 动态心形模型&#xff1a;采用数学函数生成基础形状&#xff0c;通过顶点操作实现表面弧度。星空粒子背景&#xff1a;随机分布的粒子群组形成空间层次感。复合动画…

Java线程认识和Object的一些方法

专栏系列文章地址&#xff1a;https://blog.csdn.net/qq_26437925/article/details/145290162 本文目标&#xff1a; 要对Java线程有整体了解&#xff0c;深入认识到里面的一些方法和Object对象方法的区别。认识到Java对象的ObjectMonitor&#xff0c;这有助于后面的Synchron…

【蓝桥杯省赛真题02】C++猫吃鱼 第十届蓝桥杯青少年创意编程大赛 算法思维 C++编程省赛真题解

目录 C猫吃鱼 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、运行结果 五、考点分析 七、推荐资料 C猫吃鱼 第十届蓝桥杯青少年创意编程大赛C选拔赛真题 一、题目要求 明明家从1号站点出发&#xff0c;开车去旅游&#xff0c;一共要经过n个…

无公网IP 外网访问 本地部署夫人 hello-algo

hello-algo 是一个为帮助编程爱好者系统地学习数据结构和算法的开源项目。这款项目通过多种创新的方式&#xff0c;为学习者提供了一个直观、互动的学习平台。 本文将详细的介绍如何利用 Docker 在本地安装部署 hello-algo&#xff0c;并结合路由侠内网穿透实现外网访问本地部署…

基础项目实战——学生管理系统(c++)

目录 前言一、功能菜单界面二、类与结构体的实现三、录入学生信息四、删除学生信息五、更改学生信息六、查找学生信息七、统计学生人数八、保存学生信息九、读取学生信息十、打印所有学生信息十一、退出系统十二、文件拆分结语 前言 这一期我们来一起学习我们在大学做过的课程…

实现基础的shell程序

1. 实现一个基础的 shell 程序&#xff0c;主要完成两个命令的功能 cp 和 ls 1.1.1. cp 命令主要实现&#xff1a; ⽂件复制⽬录复制 1.1.2. ls 命令主要实现&#xff1a; ls -l 命令的功能 1.1. 在框架设计上&#xff0c;采⽤模块化设计思想&#xff0c;并具备⼀定的可扩…

ADC 精度 第二部分:总的未调整误差解析

在关于ADC精度的第一篇文章中&#xff0c;我们阐述了模拟-数字转换器&#xff08;ADC&#xff09;的分辨率和精度之间的区别。现在&#xff0c;我们可以深入探讨影响ADC总精度的因素&#xff0c;这通常被称为总未调整误差&#xff08;TUE&#xff09;。 你是否曾好奇ADC数据表…

渲染流程概述

渲染流程包括 CPU应用程序端渲染逻辑 和 GPU渲染管线 一、CPU应用程序端渲染逻辑 剔除操作对物体进行渲染排序打包数据调用Shader SetPassCall 和 Drawcall 1.剔除操作 视椎体剔除 &#xff08;给物体一个包围盒&#xff0c;利用包围盒和摄像机的视椎体进行碰撞检测&#xf…