使用 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.rhkb.cn/news/10304.html

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

相关文章

(1)Linux高级命令简介

Linux高级命令简介 在安装好linux环境以后第一件事情就是去学习一些linux的基本指令&#xff0c;我在这里用的是CentOS7作演示。 首先在VirtualBox上装好Linux以后&#xff0c;启动我们的linux&#xff0c;输入账号密码以后学习第一个指令 简介 Linux高级命令简介ip addrtou…

【ArcMap零基础训练营】03 常用数据网站的数据下载及处理

03 常见数据网站的数据下载及处理 230108直播录像 常见数据下载及nc文件批处理 数据源网站汇总 名称网址备注RESDChttps://www.resdc.cn/中科院地理科学与资源研究所&#xff0c;非会员用户每日5次下载&#xff0c;大部分有用的资源均收费。TPDChttps://data.tpdc.ac.cn/国家青…

MySQL数据库(二)

一 DDL (一 数据库操作 1 查询-数据库&#xff08;所有/当前&#xff09; 1 所有数据库&#xff1a; show databases; 2 查询当前数据库&#xff1a; select database(); 2 创建-数据库 可以定义数据库的编码方式 create database if not exists ax1; create database ax2…

步入响应式编程篇(三)之spring webFlux与R2DBC

spring webFlux与R2DBC 前言Spring webFlux与spring mvc的对比spring mvcspring webFluxSSE的demo R2DBC 前言 前面介绍响应式编程主要用到基于Stream API的Reactor API的方式&#xff0c;但如今业务操作需结合springboot&#xff0c;所以spring webFlux使用的更多&#xff0c…

19.Word:小马-校园科技文化节❗【36】

目录 题目​ NO1.2.3 NO4.5.6 NO7.8.9 NO10.11.12索引 题目 NO1.2.3 布局→纸张大小→页边距&#xff1a;上下左右插入→封面&#xff1a;镶边→将文档开头的“黑客技术”文本移入到封面的“标题”控件中&#xff0c;删除其他控件 NO4.5.6 标题→原文原文→标题 正文→手…

redis数据安全与性能保障

数据安全与性能保障 1、持久化1.1 快照持久化1.2 AOF持久化1.3 重写/压缩AOF文件 2、复制2.1 Redis复制的启动过程2.2 主从链 3、处理系统故障3.1 验证快照文件和AOF文件 4、事务4.1 java中的redis事务使用 如有侵权&#xff0c;请联系&#xff5e; 如有错误&#xff0c;也欢迎…

【AI非常道】二零二五年一月(二),AI非常道

经常在社区看到一些非常有启发或者有收获的话语&#xff0c;但是&#xff0c;往往看过就成为过眼云烟&#xff0c;有时再想去找又找不到。索性&#xff0c;今年开始&#xff0c;看到好的言语&#xff0c;就记录下来&#xff0c;一月一发布&#xff0c;亦供大家参考。 有关AI非…

从巫师求雨说起

树上停着一只猫头鹰&#xff1a; 你相信吗&#xff1f;这不是一般的鸟&#xff0c;猫头鹰其实是一个人&#xff0c;它是一个巫师变的。 你不相信&#xff1f;那我问你&#xff0c;为什么猫头鹰和乌鸦一样&#xff0c;那叫声&#xff0c;常常让人瘆得慌&#xff1f;(owl&#x…

【C++】类和对象

面向对象编程 学习过C语言的小伙伴知道&#xff1a;C语言是面向过程的&#xff0c;关注的是过程&#xff0c;分析出求解问题的步骤&#xff0c;通过函数调用逐步解决问题。 面向过程编程也叫结构化编程。虽然结构化编程的理念提高了程序的清晰度&#xff0c;可靠性&#xff0c…

21.3-启动流程、编码风格(了解) 第21章-FreeRTOS项目实战--基础知识之新建任务、启动流程、编码风格、系统配置 文件组成和编码风格(了解)

21.3-启动流程、编码风格(了解) 启动流程 第一种启动流程(我们就使用这个): 在main函数中将硬件初始化、RTOS系统初始化&#xff0c;同时创建所有任务&#xff0c;再启动RTOS调度器。 第二种启动流程&#xff1a; 在main函数中将硬件初始化、RTOS系统初始化&#xff0c;只…

富文本 tinyMCE Vue2 组件使用简易教程

参考官方教程 TinyMCE Vue.js integration technical reference Vue2 项目需要使用 tinyMCE Vue2 组件(tinymce/tinymce-vue)的第 3 版 安装组件 npm install --save "tinymce/tinymce-vue^3" 编写组件调用 <template><Editorref"editor"v-m…

vue框架技术相关概述以及前端框架整合

vue框架技术概述及前端框架整合 1 node.js 介绍&#xff1a;什么是node.js Node.js就是运行在服务端的JavaScript。 Node.js是一个事件驱动I/O服务端JavaScript环境&#xff0c;基于Google的V8引擎。 作用 1 运行java需要安装JDK&#xff0c;而Node.js是JavaScript的运行环…

【AI】Deepseek本地部署探索,尝试联网搜索

前言 1月下旬&#xff0c;Deepseek-R1横空出世&#xff0c;其依靠堪比GPT-o1的推理能力&#xff0c;训练成本及使用成本均只有gpt几十分之一甚至百分之一的超高性价比&#xff0c;以及它足够“OPEN”的特性直接暴打人工智能的资本行业&#xff0c;本着求实求新的精神&#xff…

DeepSeek介绍

目录 前言 1.介绍一下你自己 2.什么是CUDA CUDA的核心特点&#xff1a; CUDA的工作原理&#xff1a; CUDA的应用场景&#xff1a; CUDA的开发工具&#xff1a; CUDA的局限性&#xff1a; 3.在AI领域&#xff0c;PTX是指什么 1. PTX 的作用 2. PTX 与 AI 的关系 3. …

WGCLOUD服务器资源监控软件使用笔记 - Token is error是什么错误

[wgcloud-agent]2025/01/30 10:41:30 WgcloudAgent.go:90: 主机监控信息上报server开始 [wgcloud-agent]2025/01/30 10:41:30 WgcloudAgent.go:99: 主机监控信息上报server返回信息: {"result":"Token is error"} 这个错误是因为agent配置的wgToken和serv…

OpenAI-Edge-TTS:本地化 OpenAI 兼容的文本转语音 API,免费高效!

文本转语音&#xff08;TTS&#xff09;技术已经成为人工智能领域的重要一环&#xff0c;无论是语音助手、教育内容生成&#xff0c;还是音频文章创作&#xff0c;TTS 工具都能显著提高效率。今天要为大家介绍的是 OpenAI-Edge-TTS&#xff0c;一款基于 Microsoft Edge 在线文本…

Leetcode 131 分割回文串(纯DFS)

131. 分割回文串https://leetcode.cn/problems/palindrome-partitioning/https://leetcode.cn/problems/palindrome-partitioning/ 给你一个字符串 s&#xff0c;请你将 s 分割成一些子串&#xff0c;使每个子串都是 回文串 。返回 s 所有可能的分割方案。 示例 1&#xff1a…

服务器虚拟化技术详解与实战:架构、部署与优化

&#x1f4dd;个人主页&#x1f339;&#xff1a;一ge科研小菜鸡-CSDN博客 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; 引言 在现代 IT 基础架构中&#xff0c;服务器虚拟化已成为提高资源利用率、降低运维成本、提升系统灵活性的重要手段。通过服务…

记录一次,PyQT的报错,多线程Udp失效,使用工具如netstat来检查端口使用情况。

1.问题 报错Exception in thread Thread-1: Traceback (most recent call last): File "threading.py", line 932, in _bootstrap_inner File "threading.py", line 870, in run File "main.py", line 456, in udp_recv IndexError: list…

【PyTorch】6.张量运算函数:一键开启!PyTorch 张量函数的宝藏工厂

目录 1. 常见运算函数 个人主页&#xff1a;Icomi 专栏地址&#xff1a;PyTorch入门 在深度学习蓬勃发展的当下&#xff0c;PyTorch 是不可或缺的工具。它作为强大的深度学习框架&#xff0c;为构建和训练神经网络提供了高效且灵活的平台。神经网络作为人工智能的核心技术&…