折腾来折腾去

pikipity的blog

Keil C 中不再编译未使用的函数

最近在为 AT89C52 编写 LCD12864 的头文件的时候发现 Keil 竟然无法自动识别未使用的函数,也就是说 Keil 会将所有函数全部编译一边,如果 main 函数中没有使用某个函数的话,这个没使用的函数不仅占用了单片机的内存,在编译结束后的 Warning 也让人很不舒服。所以去搜索了一下,大体有两种解决方法:

  1. 添加注释或者编译开关:如果对于小项目,这种方法的确可行,但是如果想编写一个具有通用意义的头文件的话,要一个个把不用的头文件注释掉,显然不实际。每次使用头文件都要修改一次注释和编译开关也不现实。所以这个方法不具有普遍适用意义。
  2. 各个函数分别编写一个 C 文件,然后仅将用到的函数编译为 OBJ。每次使用头文件都要找到需要的函数然后编译一次,也很麻烦,此方法显然也不具有普遍适用意义。

既然 Keil 默然的连接器无法识别未使用的函数,那么可不可以试试别的连接器呢?于是去 Keil 的官网逛了一圈,发现 Keil 本身就可以将默认的连接器 BL51 换为另一种连接器 LX51。赶紧更换一下试一试,更换步骤如下:

  1. 工具栏 Project -> 选择 Options For Target 'xx'
  2. Device 选项卡,选中 Use Extended Linker(LX51) instead of BL51

但是编译一中发现问题依然没有解决,这是怎么回事呢?应该是还需要添加编译选项吧。于是又去看了一下 LX 51 说明文档,发现了 “REMOVEUNUSED” 这样一个选项:

The REMOVEUNUSED directive removes unused program and data segments provided that Data Overlaying is enabled. When you apply this directive unused functions along with the related data segments are deleted in the final executable program.

这不就是我需要的嘛!!赶紧加上去:

Options For Target 'xx' 中的 LX51 Misc 选项卡中的 Misc controls 填写 “REMOVEUNUSED”。

再次编译,发现 Warning 不见了,编译之后的 hex 文件也小了,问题解决。

总结一下,就是三步:

  1. 工具栏 Project -> 选择 Options For Target 'xx'
  2. Device 选项卡,选中 Use Extended Linker(LX51) instead of BL51
  3. LX51 Misc 选项卡中的 Misc controls, 填写 “REMOVEUNUSED”(不加引号)。


Comments