专栏算法工具链【J6】工具链VP示例中Cmakelists解读

【J6】工具链VP示例中Cmakelists解读

Jade-self2025-03-01
53
0

1. 引言

在文章【J6】VP简介与单算子实操中,介绍了VP是什么,并以单算子rotate为例,介绍了VP API使用方法。在【J6】工具链VP示例中日志打印解读 中介绍了VP 单算子示例中用到的日志打印的头文件应该怎么写。接下来和大家一起看一下Cmakelists在VP示例中扮演的角色。
作为对C不那么熟悉的伙伴,可能会好奇:Cmakelists.txt怎么写?当有多层Cmakelists.txt时,他们的调用关系是什么?由于本人是属于对C不那么熟悉的同学,下面会从我的视角来介绍这个问题,如果其中有错误或表述不当的地方,欢迎评论指正。
本文是为了服务于另外一篇文章:【J6】工具链VP示例为什么能运行

2. 基础知识

写一段c++代码,怎么才能跑起来呢?

简单来说,需要在开发机上编译生成可执行文件,然后将可执行文件(bin)和相关依赖(lib,动静态链接库)拷贝到开发板上,执行“可执行文件”即可。

补充解释一下动静态链接库:

静态(函数)库 扩展名为(.a或.lib,.a是linux侧,.lib是windows侧),静态库在编译时,会直接整合到目标程序中,编译出来的文件会比较大。

  • 优点:编译出的可执行文件 可以独立运行,不再需要向外部要求读取函数库的内容。

  • 缺点:从升级难易度来看没有优势,如果函数库更新,需要重新编译。

动态(函数)库 扩展名为(.so或.dll,.so是linux侧,.dll是windows侧),动态库在编译时,在程序里只有一个“指向”的位置,也就是说,当可执行文件需要使用到 函数库 中的内容时,程序才会去读取 函数库 来使用。

  • 优点:方便产品功能升级,只要替换对应动态库即可,不必重新编译整个可执行文件。

  • 缺点:可执行文件无法单独运行。

在构建稍微规范/复杂点的C++项目时,通常会用到CmakeList,下面来看一下。

2.1 代码结构

构建一个简单但典型的case来说明一个C++项目的调用运行逻辑,项目结构如下:

在 CMake 项目中,通常会有 顶层 CMakeLists.txt,以及src子目录中的 嵌套CMakeLists.txt,它们共同组织代码的编译流程。CMake 使用 层次化调用,即 顶层 CMakeLists.txt 调用子目录 CMakeLists.txt。编译过程如下:

顶层 CMakeLists.txt: 设置编译选项、添加 src 目录、指定最终目标
src/CMakeLists.txt: 添加 main.cpp 和 main.h、包含子模块
module/CMakeLists.txt: 定义 module.cpp、生成库文件

2.2 CmakeList

  • 最外层CmakeLists.txt

  • src/CMakeLists.txt

  • src/module/CMakeLists.txt

2.3 Main

  • main.cpp

  • main.h

2.4 module

  • module.cpp

  • module.h

2.5 编译与执行

输出:

3. VP示例中Cmakelists

3.1 vp/code/07_single_rotate/CMakelists.txt

在vp/code/07_single_rotate目录下的CMakelists.txt,解读如下:

  1. DEPS_SOURCE_DIR在哪设置的?(3.2节中设置)

  2. RELEASE_BIN_DIR在哪设置的?(3.2节中设置)

带着这2个疑问,我们往外看一层CmakeLists.txt。

3.2 vp/code/CMakelists.txt

  1. PROJECT_SOURCE_DIR在哪设置的?

答:PROJECT_SOURCE_DIR 是指向项目源代码根目录的 CMake 预定义变量,常用于构建路径、引用资源文件等,帮助 CMake 找到项目中的文件。

  1. build_type在哪设置的?

答:在build.sh脚本中,详情可见文档:【J6】工具链VP示例为什么能运行

4. 总结

本文主要介绍在VP 单算子示例中用到的CmakeLists.txt应该怎么写,主要适用于和我一样C++基础学习用户~

算法工具链
社区征文技术深度解析杂谈
评论0
0/1000