当前位置: 首页 > article >正文

使用 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赋值OBJS
 
CC=gcc
$(TARGET):$(OBJS)
        $(CC) -o $(TARGET) $(OBJS)  
%.o:%.c
        $(CC) -c  $< -o $@          #$@表示目标文件,$<依赖.o
 
.PHONY:clean  echo
 
echo:
        @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.kler.cn/a/527808.html

相关文章:

  • I.MX6ULL 中断介绍上
  • 二级C语言:二维数组每行最大值与首元素交换、删除结构体的重复项、取出单词首字母
  • 前端八股CSS:盒模型、CSS权重、+与~选择器、z-index、水平垂直居中、左侧固定,右侧自适应、三栏均分布局
  • Java小白入门教程:内置数据类型(四类八种)和引用数据类型
  • HTML<hgroup>标签
  • 步入响应式编程篇(三)之spring webFlux与R2DBC
  • 书生大模型实战营6
  • 动态规划每日一练(四)
  • 算法11(力扣496)-下一个更大元素I
  • MATLAB-Simulink并行仿真示例
  • 前端 Vue 性能提升策略
  • DeepLens是一个用于计算镜头设计的可微光线追踪器
  • Redis代金卷(优惠卷)秒杀案例-多应用版
  • JVM的GC详解
  • 六. Redis当中的“发布” 和 “订阅” 的详细讲解说明(图文并茂)
  • Fiddler(一) - Fiddler简介_fiddler软件
  • Spring--Bean的生命周期和循环依赖
  • leetcode——将有序数组转化为二叉搜索树(java)
  • SFTP 使用方法
  • 【Blazor学习笔记】.NET Blazor学习笔记
  • 【算法-位运算】求数字的补数
  • 知识库管理在提升客户服务质量中的应用与挑战分析
  • 嵌入式八股文之深入理解 C语言中的指针相关概念
  • 04树 + 堆 + 优先队列 + 图(D1_树(D2_二叉树(BT)(D1_基础学习)))
  • 笔记:电机及控制器的功率测量是怎么进行的?
  • 服务器架构设计大全及其优缺点概述