搜索
bottom↓
回复: 26

IAR关于生成.Lib时,功能裁剪不掉?

[复制链接]

出0入0汤圆

发表于 2013-5-14 11:14:32 | 显示全部楼层 |阅读模式
我目前在做一案子,其中芯片是:uPD78F0513_44;编译器是:IAR Systems icc78K。
    由于做的产品具有系列性的,比如说基本版本,...,高级版本(高级版本在基本版本上增加功能),另外还有一些功能选项比如寿命测试等。
    客人的要求是版本与功能他可以自己选择不同的组合,然后编译成不同系统的对应产品。
    很自然,我不可能把所有的源码都给客人,只把要配置的参数独立成两个文件给他,比如说config.h,用宏进行条件编译,然后生成一个.Lib文件.
    但问题出现了,想去掉的功能裁剪不掉(比如说,我在生成.Lib之前,功能是ENABLE的,现在我改为DISABLE时,它的功能仍然在)。但如用源码(即没生成库之前)是可以的。
    我觉得这个功能应可以实现的,比如说uC/GUI里,当用.Lib时,也可以把不要的功能裁剪掉,以节省空间。
    请问大神,这个问题如何解决?

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2013-5-14 12:06:42 来自手机 | 显示全部楼层
呵呵,关注

出0入0汤圆

 楼主| 发表于 2013-5-14 17:41:56 | 显示全部楼层
自己顶!

出0入0汤圆

 楼主| 发表于 2013-5-18 16:20:11 | 显示全部楼层
AVT-DENG 发表于 2013-5-18 11:26
是因为你生成库的方式不对
条件编译(#DEFINE)
与库(LIBRARY)是两个完全不同的概念.

我是摸索着做的。
请教一下如何生成?麻烦说一下过程。期待。。。

出0入0汤圆

发表于 2013-5-18 17:18:20 | 显示全部楼层
有价值
记号一下
等懂得人回答

出0入0汤圆

发表于 2013-5-18 17:23:51 | 显示全部楼层
你是怎样编译的lib, 重新编译lib的时候, 先进行一次 clean的操作,把原来生成的目标文件全部清理掉,
然后重新编译, 应当就不会出现了, 首先要保证你的条件编译的条件正确, 比如#ifdefine 和 #if 的区别,

出0入0汤圆

 楼主| 发表于 2013-5-19 14:58:25 | 显示全部楼层
xiaomu 发表于 2013-5-18 17:23
你是怎样编译的lib, 重新编译lib的时候, 先进行一次 clean的操作,把原来生成的目标文件全部清理掉,
然 ...

都clean过,且我一般都用rebuild all,但都是一样的情况。
不过,您最后一句提醒了我,宏条件里,我都只用了#if,而不是#ifdefine。我觉得这个是问题所在的可能性会很大。
明天回公司试一下看。如通过了,我第一时间告知大家。

出0入0汤圆

 楼主| 发表于 2013-5-20 15:41:33 | 显示全部楼层
xiaomu 发表于 2013-5-18 17:23
你是怎样编译的lib, 重新编译lib的时候, 先进行一次 clean的操作,把原来生成的目标文件全部清理掉,
然 ...

兄弟,问题如故。

出0入0汤圆

 楼主| 发表于 2013-5-20 15:44:11 | 显示全部楼层
生成库的方式,我用这个(由于上传图片不方便,我直接给网址好了):
http://blog.sina.com.cn/s/blog_66ec8d880100hfo5.html

出0入0汤圆

发表于 2013-5-20 16:18:25 | 显示全部楼层
yoje 发表于 2013-5-20 15:44
生成库的方式,我用这个(由于上传图片不方便,我直接给网址好了):
http://blog.sina.com.cn/s/blog_66ec8d ...

按照网页的方式, 应当是 *.h不参与编译,所以,编译器会按照默认的编译条件进行编译.

你试试在 option->c/c++ complire -> preproceesor, 里面 define symbol, 定义你要编译的条件,

出0入0汤圆

 楼主| 发表于 2013-5-20 17:46:43 | 显示全部楼层
xiaomu 发表于 2013-5-20 16:18
按照网页的方式, 应当是 *.h不参与编译,所以,编译器会按照默认的编译条件进行编译.

你试试在 option->c/ ...

结果还是一样,不行喔!
首先从烧录出来的功能看,想要去掉的功能没有被剪掉;
从编译所得的空间来看也是一样:
13 301 bytes of CODE  memory
    298 bytes of DATA  memory (+ 55 absolute )
  1 254 bytes of CONST memory


13 301 bytes of CODE  memory
    298 bytes of DATA  memory (+ 55 absolute )
  1 234 bytes of CONST memory

最后的,CONST memory会少若干字节,因为有一个config.c文件被我排除掉而没有编进Lib里面(几个数组,存放客户需要配置的一些属性)。
使用这个文件与Lib一起编译时(如下图工程文件),里面的其干数组元素被裁剪掉了(这也是原来的问题,Lib不能裁剪而源码则可以)。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2013-5-21 21:36:37 | 显示全部楼层
AVT-DENG 发表于 2013-5-18 11:26
是因为你生成库的方式不对
条件编译(#DEFINE)
与库(LIBRARY)是两个完全不同的概念.

请问,按你的方式,应怎样生成?

出0入0汤圆

 楼主| 发表于 2013-6-7 10:21:30 | 显示全部楼层
问题还没解决,不知如何把它设置为悬赏模式?
“重复发帖,将会被封锁ID”!!!

出0入0汤圆

发表于 2013-12-29 19:54:55 | 显示全部楼层
最近也在查看IAR生成库的方式,楼主的问题解决了么?

出0入0汤圆

 楼主| 发表于 2013-12-30 08:49:40 | 显示全部楼层
TongIC 发表于 2013-12-29 19:54
最近也在查看IAR生成库的方式,楼主的问题解决了么?

还没是搞好,最后还是以多个版本的形式给出去!

出0入0汤圆

发表于 2013-12-30 09:10:10 | 显示全部楼层
是没法改,上次玩320240的触摸屏,参数也是预编译的,结果改了预定义之后,生成的lib不相应的改变......

我觉得索性就不要预编译了,直接定义个变量吧,每次给变量赋个初值好了......

出0入0汤圆

 楼主| 发表于 2013-12-30 09:23:54 | 显示全部楼层
听说是可以的,现在的编译器可以做到。但没时间钻研这编译器手册。

出0入0汤圆

发表于 2013-12-30 09:36:35 | 显示全部楼层
lib不能改是当然的,已经编译好生成的lib在你修改过.h那些文件再次编译时候并不会再次参与编译了,因为lib不会被逆向还原的。只能通过变量来做传递条件,预定义和常量是改不了的。

出0入0汤圆

 楼主| 发表于 2013-12-30 09:38:05 | 显示全部楼层
Eiman 发表于 2013-12-30 09:36
lib不能改是当然的,已经编译好生成的lib在你修改过.h那些文件再次编译时候并不会再次参与编译了,因为lib ...

不是改变Lib,而是按自己设定的条件抽取自己要的内容而已!

出0入0汤圆

发表于 2013-12-30 09:40:06 | 显示全部楼层
其实你用条件编译就是要改变lib的,除非使用变量传递方式就不用改变lib了。

出0入0汤圆

发表于 2013-12-30 10:01:05 | 显示全部楼层
可以的,我一般这样做:

头文件里:
//#define _USE_FUN1_ 1   //不使用FUN1
#define _USE_FUN2_ 1 //使用FUN2
#define _USE_FUN3_ 1 //使用FUN3
……
C文件里:
#if defined(_USE_FUN1)
int fun1()
{}
#endif

#if defined(_USE_FUN2)
int fun2()
{}
#endif

#if defined(_USE_FUN3)
int fun3()
{}
#endif

……

出0入0汤圆

 楼主| 发表于 2013-12-30 11:28:19 | 显示全部楼层
Eiman 发表于 2013-12-30 09:40
其实你用条件编译就是要改变lib的,除非使用变量传递方式就不用改变lib了。 ...

我的目的是生成一个Lib,就可用这个Lib替代源码。用在其它工程上,所以,其它工程只是对这个Lib读取,而非修改喔.

出0入0汤圆

 楼主| 发表于 2013-12-30 11:33:05 | 显示全部楼层
mhw 发表于 2013-12-30 10:01
可以的,我一般这样做:

头文件里:

当然,直接用源码编译是不存在这个问题的。
生成Lib之后,去掉源码,直接用Lib编译,你再配置你这个头文件,看能不能实现裁剪?

出0入0汤圆

发表于 2013-12-30 12:33:57 | 显示全部楼层
yoje 发表于 2013-12-30 11:33
当然,直接用源码编译是不存在这个问题的。
生成Lib之后,去掉源码,直接用Lib编译,你再配置你这个头文 ...

如果不把整个工程生成库,而把核心的.c文件生成库,而源程序中保留条件编译,这样不就可以了?

出0入0汤圆

 楼主| 发表于 2013-12-30 13:23:31 | 显示全部楼层
TongIC 发表于 2013-12-30 12:33
如果不把整个工程生成库,而把核心的.c文件生成库,而源程序中保留条件编译,这样不就可以了? ...

这样与所有源码生成库,是没有本质区别的。试过,也是不行的!

出0入0汤圆

发表于 2013-12-30 13:26:13 | 显示全部楼层
本帖最后由 Eiman 于 2013-12-30 13:31 编辑
yoje 发表于 2013-12-30 11:28
我的目的是生成一个Lib,就可用这个Lib替代源码。用在其它工程上,所以,其它工程只是对这个Lib读取,而非 ...


我的意思是说这样做不到的。#ifdef 是条件编译语句。注意“编译”这两个字。

举个例子,你对一个test.c的问题进行编译,他会生成test.obj其实lib文件是由obj文件而来的,所以你在test.c里面的某些代码用宏来进行条件编译,可以比较宏定义mask前的其obj文件和mask后的obj文件,其实结果两者是有差异的,也就说lib也会不一样,所以用宏做条件编译不能统一lib。

出0入0汤圆

发表于 2013-12-30 14:21:17 | 显示全部楼层
yoje 发表于 2013-12-30 11:33
当然,直接用源码编译是不存在这个问题的。
生成Lib之后,去掉源码,直接用Lib编译,你再配置你这个头文 ...

看来你没理解什么叫条件编译……

条件编译就是把多余的代码通过宏开关屏蔽掉,不参与生成目标代码(bin或lib)……所以你的要求是不可能实现的。如果图自己方便就把所有的函数都生成一个lib,用户编译时,编译器会自动把用不到的功能优化掉;否则就自己编译出N个版本的lib……
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-26 10:57

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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