使用 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,一经查实,立即删除!

相关文章

数据结构【单链表操作大全详解】【c语言版】(只有输入输出为了方便用的c++)

单链表操作的C/C实现详解 在数据结构中&#xff0c;单链表是一种非常基础且重要的数据结构。它由一系列节点组成&#xff0c;每个节点包含数据和指向下一个节点的指针。今天我们就来深入探讨用C/C实现的单链表及其各种操作。 一、单链表的定义 const int N 1e5; //单链表 t…

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

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

第28章 星骗计划的开篇

深夜&#xff0c;万籁俱寂&#xff0c;世界仿佛被按下了静音键。东方艾艾独自坐在窗前&#xff0c;月光如银纱般倾洒在屋内&#xff0c;给一切都蒙上了一层梦幻的色彩。这时&#xff0c;小谷的声音在他脑海里悠悠响起&#xff1a;“主人&#xff0c;咱们所长虽年事已高&#xf…

如何将IP切换到海外:详细指南

在现代互联网应用中&#xff0c;IP地址成为了网络通信和数据交换的基础。然而&#xff0c;很多时候&#xff0c;由于区域限制或隐私保护的需求&#xff0c;用户可能需要将自己的IP地址切换到海外。无论是为了绕过地域限制访问内容&#xff0c;还是为了提高隐私安全&#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源…

什么是词嵌入?Word2Vec、GloVe 与 FastText 的区别

自然语言处理(NLP)领域的核心问题之一,是如何将人类的语言转换成计算机可以理解的数值形式,而词嵌入(Word Embedding)正是为了解决这个问题的重要技术。本文将详细讲解词嵌入的概念及其经典模型(Word2Vec、GloVe 和 FastText)的原理与区别。 1. 什么是词嵌入(Word Em…

笔记本搭配显示器

笔记本&#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…

Docker小游戏 | 使用Docker部署RPG网页小游戏

Docker小游戏 | 使用Docker部署RPG网页小游戏 前言一、项目介绍项目简介项目预览二、系统要求环境要求环境检查Docker版本检查检查操作系统版本三、部署RPG网页小游戏下载镜像创建容器检查容器状态检查服务端口安全设置四、访问RPG网页小游戏五、总结前言 随着互联网技术的不断…

如何把一个python文件打包成一步一步安装的可执行程序

将一个 Python 文件打包成可执行程序&#xff08;如 .exe 文件&#xff09;&#xff0c;并实现一步一步的安装过程&#xff0c;通常需要以下步骤&#xff1a; 1. 将 Python 文件打包成可执行文件 使用工具将 Python 脚本打包成可执行文件&#xff08;如 .exe&#xff09;。常用…

K8S 快速实战

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

setupdd!SpAppendDiskTag函数分析之末尾添加字符串

setupdd!SpAppendDiskTag函数分析之末尾添加字符串 SpAppendDiskTag函数运行之前&#xff0c; 0: kd> db 0xe108a07c e108a07c 31 00 35 00 33 00 35 00-34 00 20 00 4d 00 42 00 1.5.3.5.4. .M.B. e108a08c 20 00 44 00 69 00 73 00-6b 00 20 00 30 00 20 00 .D.…

Ubuntu 18.04安装Emacs 26.2问题解决

个人博客地址&#xff1a;Ubuntu 18.04安装Emacs 26.2问题解决 | 一张假钞的真实世界 no X development libraries were found checking for X... no checking for X... true configure: error: You seem to be running X, but no X development libraries were found. You …

软考信安27~Windows操作系统安全相关

1、Windows账户与组管理 1.1、用户账户查看 whoami #查看当前登录的用户名称 whoami /all #查看当前系统的用户名和组信息,以及SID whoami /user #查看当前用户的SID net user #查看系统中包含哪些用户 wmic useraccount get name,sid #查看…

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

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