打印

关于末使用函数的编译

[复制链接]
1995|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
380121850|  楼主 | 2010-2-24 19:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
关于末使用函数的编译                                                                                                                                                                                                                                                                                                                        怎么防止KEIL把一些没有调用的函数也编译进最终目标代码?除了条件编译外,这个问题,比较碍眼
IAR倒聪明多了~

相关帖子

沙发
NE5532| | 2010-2-24 21:53 | 只看该作者
如果编译器没有特别处理,要编译进去的。

使用特权

评论回复
板凳
冷漠| | 2010-2-24 22:05 | 只看该作者
不会。除非你不注意,把调用到的函数和没有调用到的函数写在了同一个模块里。
编译器是按照模块.OBJ连接的。不是按照函数连接的。

因此,你要有选择地按函数连接,你就要把每个函数都写成一个独立的XXX.C 或.ASM 模块。

使用特权

评论回复
地板
NE5532| | 2010-2-24 22:40 | 只看该作者
准确说应该是进入了工程源文件里的代码都会生成目标代码,比如你在工程文件夹里放了个C文件,不会编译进去,如果加在工程里,就进去了。

使用特权

评论回复
5
yewuyi| | 2010-2-25 14:51 | 只看该作者
有一些编译器对未使用的函数会直接优化掉他。

使用特权

评论回复
6
byeyear| | 2010-2-25 14:55 | 只看该作者
首先,我们平时说的编译实际上可粗略分为生成可重定位目标文件(obj或o)和连接(link)为可执行目标文件两个阶段
在第一阶段,未使用函数肯定会参加编译的,因为第一阶段没办法知道哪些函数没有使用----即使单独一个模块(文件)内不用,难保其他模块不会用。所以可能的话尽量把函数声明为static,这样未使用函数第一阶段就不会参加编译;
如果在第一阶段为每一个函数产生section,那么到了第二阶段linker就可以知道哪些函数没有使用,从而在该阶段将这些函数从最终的目标文件中删除。
几乎所有编译器都提供编译选项,在第一阶段对每一个函数产生单独section,并在第二阶段删除未用section。有集成开发环境的可以在开发环境里设置;没有集成环境的查编译器手册。

使用特权

评论回复
7
xlsbz| | 2010-2-26 08:07 | 只看该作者
楼上研究挺透啊

我知道问使用函数编译进去后,就被当做中断函数了 KEIL下。

未使用函数的话,

if 0
未使用函数
endif##

这种咋样?

使用特权

评论回复
8
yewuyi| | 2010-2-26 08:32 | 只看该作者
这句未必正确的:即使单独一个模块(文件)内不用,难保其他模块不会用。

这通过对各个文件中的宏扫描就可以做出判断了,外部函数如果没有在本文件中用extern做原型申明,是不被承认的。

使用特权

评论回复
9
byeyear| | 2010-2-26 17:51 | 只看该作者
这句未必正确的:即使单独一个模块(文件)内不用,难保其他模块不会用。

这通过对各个文件中的宏扫描就可以做出判断了,外部函数如果没有在本文件中用extern做原型申明,是不被承认的。
=================================================================
1. 外部函数的原型声明不是必须加extern关键字,只要有原型就可以,只有变量才要求必须有extern;
2. 如果编译器不支持扩展语法且项目中不存在库形式的提供的文件,那么确实可以通过源文件扫描作出判断,但考虑到可能存在库文件,这一步工作还是要到link阶段再做比较合适,因为库文件是以类似section方式存储的;
3. 再考虑到很多编译器支持扩展语法(比如IAR对 1 的要求并不严格,可以在没有原型的情况下调用函数,该扩展可以通过编译选项控制),只能在link阶段做删除未用section的工作了。

使用特权

评论回复
10
yewuyi| | 2010-2-26 21:58 | 只看该作者
库文件需要使用include关键字加入到当前文件中,这个也完全可以通过源文件扫描找到具体使用了哪个库函数并连接他.

根据我道听途说所知道的,其实啊各个厂家在这个上面并没有标准做法,各家所采用的方法不尽相同,但多数是结合了扫描和连接两个一起找.

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

10

主题

79

帖子

0

粉丝