Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
SCons
SConscript
【学习分享】libc的版本探测
发布于 2024-04-23 13:06:49 浏览:376
订阅该版
[tocm] # libc的版本探测 ## 简介 不知道大家有没有注意我们使用Scons构建工程时,一般都会有一行关于c库的版本号: ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20240423/cc47e09f60bb1befb804abf34be47f91.png) 通过打印的数据我们可以发现,我们使用的的`4.1.0`版本的`newlib`。 那么scons是如何探测到libc库并且获取到它的版本号的呢?我们进入源码一探究竟。 ## 寻找newlib 能够打印newlib的版本信息的地方,肯得得是跟newlib相关的,那么我们就先寻找是否存在newlib文件夹。 最后发现还真有newlib文件夹,它位于`rt-thread --> componets --> libc --> newlibc` ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20240423/f597679315528f825b12764855a0b53b.png) 我们进入newlib文件中的SConscript文件,发现一段代码就是关于打印newlib版本的: ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20240423/ef9d643209eb9aebc670f0af0591d558.png) 三句代码完成了三个步骤:获取版本号 --> 判断是否获取成功 --> 打印 这个时候我就好奇了,GetNewLibVersion是怎么获取版本号的呢?带着这个疑问我马上查看了该函数的定义。 定义位于:`rt-thread/tools/gcc.py` 定义如下: > 在解释代码逻辑之前先解释一下GetHeader函数的作用: > > 函数有两个参数:全局配置对象,文件名 > > 函数会从全局配置对象中获取env中gcc工具链的路径,然后查看工具链中是否存在这个文件 ```python def GetNewLibVersion(rtconfig): version = None try: rtconfig.PREFIX except: return version # if find picolibc.h, use picolibc fn = GetHeader(rtconfig, 'picolibc.h') if fn: return version # get version from _newlib_version.h file fn = GetHeader(rtconfig, '_newlib_version.h') # get version from newlib.h if not fn: fn = GetHeader(rtconfig, 'newlib.h') if fn: f = open(fn, 'r') for line in f: if line.find('_NEWLIB_VERSION') != -1 and line.find('"') != -1: version = re.search(r'\"([^"]+)\"', line).groups()[0] f.close() return version ``` GetLibVersion函数会从工具链中查找指定头文件,根据工具链中存在的头文件确定使用的libc库,然后再读取头文件中的信息获取版本号。 我们根据打印信息可以知道,工具链使用的头文件是`_newlib_version.h`,通过读取该文件便获取了4.1.0的版本号。 我们可以去env工具中查找工具链的位置:`env-windows-1.5.0\tools\gnu_gcc\arm_gcc\mingw\arm-none-eabi` 进入inlcude文件夹后我们就可以找到`_newlib_version.h`文件,打开文件就可以看见newlib的版本号了,具体定义如下: ```c /* _newlib_version.h. Generated from _newlib_version.hin by configure. */ /* Version macros for internal and downstream use. */ #ifndef _NEWLIB_VERSION_H__ #define _NEWLIB_VERSION_H__ 1 #define _NEWLIB_VERSION "4.1.0" #define __NEWLIB__ 4 #define __NEWLIB_MINOR__ 1 #define __NEWLIB_PATCHLEVEL__ 0 #endif /* !_NEWLIB_VERSION_H__ */ ```
0
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
比特饼干
这家伙很懒,什么也没写!
文章
10
回答
1
被采纳
0
关注TA
发私信
相关文章
1
scons不支持python3吗?
2
编译又出现问题
3
BSP目录下做好一个项目后,怎么把发给别人的包裁剪的小...
4
为什么重新scons --target=mdk 后,以前在MDK工程里保存的C文
5
Scons 添加Group,SConscript已经执行,源码却没有添加进工程
6
scons如何指定输出目录?
7
新人求助。
8
想用env 工具自己构建编译环境想用vscode 进行一些简单程序
9
关于scons脚本问题
10
使用scons --target=makefile的问题
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
WIZnet_W5500
UART
ota在线升级
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
rt_mq_消息队列_msg_queue
keil_MDK
ulog
MicroPython
C++_cpp
本月问答贡献
a1012112796
20
个答案
3
次被采纳
张世争
11
个答案
3
次被采纳
踩姑娘的小蘑菇
7
个答案
3
次被采纳
rv666
9
个答案
2
次被采纳
用户名由3_15位
13
个答案
1
次被采纳
本月文章贡献
程序员阿伟
9
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
RTT_逍遥
1
篇文章
6
次点赞
大龄码农
1
篇文章
5
次点赞
ThinkCode
1
篇文章
1
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部