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

如何找出OSS的引用所有的头文件

对于正式版本软件的release, 在release之前我们都要做一下OSS检查, 以防我们的代码引用了一些有一些不合适的license的第三方代码,正好最近有一个需求需要将我们所用到的OSS库的头文件全部取出来,对于OSS库, 我们正常用到哪些功能, 我们就引用哪些功能的库, 所以不可能将所有的头文件全部取出来, 那么如何正确的找到引用的部分,就需要借助编译工具了

这里我们借助了clang工具

什么是 Clang?

Clang 是一个现代化的 C、C++、Objective-C 和 Objective-C++ 编译器,基于 LLVM 项目开发。它具有以下特点:

  1. 高性能:快速编译,同时支持增量编译。
  2. 模块化设计:与 LLVM 集成,支持自定义编译流程。
  3. 丰富的工具链:除了编译,还能生成头文件依赖、分析代码、静态检查等。
  4. 清晰的错误信息:比传统编译器(如 GCC)提供更人性化的诊断输出。

Clang 在实际使用中,不仅用于代码编译,还可用于代码分析和依赖生成。


如何用 Clang 找出 OSS 的引用头文件?

如果你想找出某个开源项目(OSS)中所有源文件引用的头文件,可以按照以下步骤操作:


1. 使用 clang -Mclang -MM
  • -M:生成完整的依赖信息(包括用户头文件和系统头文件)。
  • -MM:生成精简的依赖信息(仅包含用户头文件)。
clang -M -I<include_paths> source_file.c

说明

  • -I<include_paths>:指定头文件的搜索路径(可重复,支持多个 -I)。
  • source_file.c:你想分析的 C 文件。

2. 遍历所有源文件

如果需要处理整个项目,可以对所有源文件执行依赖分析:

find . -name "*.c" -exec clang -M -I<include_paths> {} \;

解释

  • find . -name "*.c":查找项目中的所有 .c 源文件。
  • -exec clang -M ... {}:对每个找到的源文件运行 clang -M

3. 使用工具生成完整的依赖清单

为了得到项目所有头文件的完整引用,可以结合 make 或脚本处理输出。例如:

脚本示例:

#!/bin/bash
INCLUDE_FLAGS="-I./include -I/usr/include"
for file in $(find . -name "*.c"); do
    clang -M $INCLUDE_FLAGS "$file" >> dependencies.txt
done
  • 输出的 dependencies.txt 会包含所有头文件的引用关系。

4. 可视化依赖

将结果转化为可读性更好的格式,比如依赖图:

  1. 使用工具如 graphviz 转换依赖为图形。
  2. 将输出依赖解析为图形工具的输入格式。

示例

假设项目中有以下文件:

  • main.c:

    #include <stdio.h>
    #include "myheader.h"
    
  • myheader.h:

    #ifndef MYHEADER_H
    #define MYHEADER_H
    void my_function();
    #endif
    

运行以下命令:

clang -M -I./include main.c

输出:

main.o: main.c /usr/include/stdio.h ./myheader.h

总结流程

  1. 确定头文件搜索路径:使用 -I 指定项目和系统头文件路径。
  2. 使用 Clang 生成依赖:选择 -M(完整)或 -MM(仅用户头文件)。
  3. 处理所有文件:用脚本或 find 遍历项目所有源文件。
  4. 存储或分析结果:输出结果供构建系统或代码审查使用。

这个方法可以帮助你清晰地看到项目中引用的所有头文件及其依赖关系。


http://www.kler.cn/a/455309.html

相关文章:

  • QML学习(五) 做出第一个简单的应用程序
  • QT 控件定义为智能指针引发的bug
  • Go+chromedp实现Web UI自动化测试
  • 【Git】—— 使用git操作远程仓库(gitee)
  • 如何给负载均衡平台做好安全防御
  • uniapp 文本转语音
  • 【Springboot知识】Springboot进阶-实现CAS完整流程
  • 计算机网络 (10)网络层
  • LinkedList类 (链表)
  • 线性代数行列式
  • ABC 385G(Counting Buildings-多项式)
  • Perl 特殊变量
  • Java爬虫实战:获取亚马逊商品评论详解
  • 实战案例——ZooKeeper集群部署(新手教程超详细)
  • 【程序】C语言右左法则----复杂指针解析
  • GTM023 W.H.Greub线性代数经典教材:Linear Algebra
  • 如何调用百度文心(Baidu Wenxin)和讯飞星火(iFlytek Spark)API
  • 《一文读懂卷积网络CNN:原理、模型与应用全解析》
  • IBatis和MyBatis在细节上的不同有哪些
  • python递归最多多少层
  • 【YOLOv3】源码(train.py)
  • Cascader 级联选择器一级单选二级多选
  • TCP off-path exploits(又一个弄巧成拙的例子)
  • PyAudio库基本知识详解——为自制PCM音频播放器做准备
  • 指针详解之 难点、易错点一次性彻底击碎!
  • vue3和springboot使用websocket通信