找回密码
 立即注册
查看: 192|回复: 4

请教:keil编译库函数时是编译所有库函数文件,还是只编译引用到的库函数?

[复制链接]
  • 打卡等级:偶尔看看II
  • 打卡总天数:22
  • 最近打卡:2025-04-04 09:38:28
已绑定手机

2

主题

4

回帖

106

积分

注册会员

积分
106
发表于 2025-3-23 14:43:46 | 显示全部楼层 |阅读模式
请教:keil编译库函数时是编译所有库函数文件,还是只编译引用到的库函数?

我include 一个库函数文件,但是在主程序中仅仅调用了这个文件里面的一个函数,请问编译器会编译整个库函数文件么?还是说仅仅编译调用到的函数?

我发现编译的时候下面会有警告提示我有些函数没有调用,好像是编译了整个库函数文件的,但是这样会不会占用code空间呢?
回复

使用道具 举报 送花

3

主题

1160

回帖

1031

积分

等待验证会员

积分
1031
发表于 2025-3-23 14:48:00 | 显示全部楼层
在Keil编译环境中,编译器的行为取决于具体的设置和优化选项。通常情况下,Keil编译器会进行“死代码消除”(Dead Code Elimination, DCE)优化。这意味着编译器只会编译和链接实际被引用到的函数和变量,而不会编译整个库函数文件。因此,即使你include了一个库函数文件,但只调用了其中的一个函数,编译器通常只会编译和链接这个被调用的函数,而不会编译整个库文件。

然而,如果你在编译过程中看到警告提示某些函数未被调用,这可能是因为编译器在编译时仍然会解析整个库文件,以检查是否存在未使用的函数或变量。但最终生成的二进制文件中,未使用的函数通常会被优化掉,不会占用code空间。

为了进一步减少代码体积,你可以启用编译器的优化选项(如-O1、-O2或-O3),这些选项会增强编译器的优化能力,进一步消除未使用的代码。此外,确保你的链接器设置正确,以避免不必要的库文件被链接到最终的可执行文件中。

总结来说,Keil编译器通常只会编译和链接实际被引用到的函数,未使用的函数会被优化掉,不会占用code空间。

[本文内容由国芯人工智能辅助生成,仅供参考]
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:422
  • 最近打卡:2025-05-01 09:54:52
已绑定手机

19

主题

3190

回帖

4866

积分

论坛元老

积分
4866
发表于 2025-3-23 15:03:17 | 显示全部楼层
看你自己怎么设置的了,如果加了REMOVEUNUSED就知道编译引用的。没加警告加编译全部。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看II
  • 打卡总天数:22
  • 最近打卡:2025-04-04 09:38:28
已绑定手机

2

主题

4

回帖

106

积分

注册会员

积分
106
发表于 2025-3-23 15:04:50 | 显示全部楼层
谢谢老师!
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看II
  • 打卡总天数:22
  • 最近打卡:2025-04-04 09:38:28
已绑定手机

2

主题

4

回帖

106

积分

注册会员

积分
106
发表于 2025-3-23 16:24:51 | 显示全部楼层
老师,我实际比较了一下,还是有一些疑问:
下图是我把调用的函数放在main函数里面定义,实际编译下来code大小是185
C:\Users\Administrator\Desktop\185.png但是,如果用库函数调用的方式,同样仅仅调用这个函数,code就变成645
C:\Users\Administrator\Desktop\645.png我的Keil 编译设置如下:
C:\Users\Administrator\Desktop\优化.png我的问题出在哪里呢?


定义在Main函数

定义在Main函数

通过库函数调用

通过库函数调用

我的编译配置

我的编译配置
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 01:36 , Processed in 0.116517 second(s), 75 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表