IAR关于生成.Lib时,功能裁剪不掉?
我目前在做一案子,其中芯片是:uPD78F0513_44;编译器是:IAR Systems icc78K。由于做的产品具有系列性的,比如说基本版本,...,高级版本(高级版本在基本版本上增加功能),另外还有一些功能选项比如寿命测试等。
客人的要求是版本与功能他可以自己选择不同的组合,然后编译成不同系统的对应产品。
很自然,我不可能把所有的源码都给客人,只把要配置的参数独立成两个文件给他,比如说config.h,用宏进行条件编译,然后生成一个.Lib文件.
但问题出现了,想去掉的功能裁剪不掉(比如说,我在生成.Lib之前,功能是ENABLE的,现在我改为DISABLE时,它的功能仍然在)。但如用源码(即没生成库之前)是可以的。
我觉得这个功能应可以实现的,比如说uC/GUI里,当用.Lib时,也可以把不要的功能裁剪掉,以节省空间。
请问大神,这个问题如何解决?
呵呵,关注 自己顶!{:time:} AVT-DENG 发表于 2013-5-18 11:26 static/image/common/back.gif
是因为你生成库的方式不对
条件编译(#DEFINE)
与库(LIBRARY)是两个完全不同的概念.
我是摸索着做的。
请教一下如何生成?麻烦说一下过程。期待。。。 有价值
记号一下
等懂得人回答 你是怎样编译的lib, 重新编译lib的时候, 先进行一次 clean的操作,把原来生成的目标文件全部清理掉,
然后重新编译, 应当就不会出现了, 首先要保证你的条件编译的条件正确, 比如#ifdefine 和 #if 的区别, xiaomu 发表于 2013-5-18 17:23 static/image/common/back.gif
你是怎样编译的lib, 重新编译lib的时候, 先进行一次 clean的操作,把原来生成的目标文件全部清理掉,
然 ...
都clean过,且我一般都用rebuild all,但都是一样的情况。
不过,您最后一句提醒了我,宏条件里,我都只用了#if,而不是#ifdefine。我觉得这个是问题所在的可能性会很大。
明天回公司试一下看。如通过了,我第一时间告知大家。 xiaomu 发表于 2013-5-18 17:23 static/image/common/back.gif
你是怎样编译的lib, 重新编译lib的时候, 先进行一次 clean的操作,把原来生成的目标文件全部清理掉,
然 ...
兄弟,问题如故。 生成库的方式,我用这个(由于上传图片不方便,我直接给网址好了):
http://blog.sina.com.cn/s/blog_66ec8d880100hfo5.html yoje 发表于 2013-5-20 15:44 static/image/common/back.gif
生成库的方式,我用这个(由于上传图片不方便,我直接给网址好了):
http://blog.sina.com.cn/s/blog_66ec8d ...
按照网页的方式, 应当是 *.h不参与编译,所以,编译器会按照默认的编译条件进行编译.
你试试在 option->c/c++ complire -> preproceesor, 里面 define symbol, 定义你要编译的条件,
xiaomu 发表于 2013-5-20 16:18 static/image/common/back.gif
按照网页的方式, 应当是 *.h不参与编译,所以,编译器会按照默认的编译条件进行编译.
你试试在 option->c/ ...
结果还是一样,不行喔!
首先从烧录出来的功能看,想要去掉的功能没有被剪掉;
从编译所得的空间来看也是一样:
13 301 bytes of CODEmemory
298 bytes of DATAmemory (+ 55 absolute )
1 254 bytes of CONST memory
13 301 bytes of CODEmemory
298 bytes of DATAmemory (+ 55 absolute )
1 234 bytes of CONST memory
最后的,CONST memory会少若干字节,因为有一个config.c文件被我排除掉而没有编进Lib里面(几个数组,存放客户需要配置的一些属性)。
使用这个文件与Lib一起编译时(如下图工程文件),里面的其干数组元素被裁剪掉了(这也是原来的问题,Lib不能裁剪而源码则可以)。
AVT-DENG 发表于 2013-5-18 11:26 static/image/common/back.gif
是因为你生成库的方式不对
条件编译(#DEFINE)
与库(LIBRARY)是两个完全不同的概念.
请问,按你的方式,应怎样生成?{:handshake:} 问题还没解决,不知如何把它设置为悬赏模式?
“重复发帖,将会被封锁ID”!!! 最近也在查看IAR生成库的方式,楼主的问题解决了么?
TongIC 发表于 2013-12-29 19:54
最近也在查看IAR生成库的方式,楼主的问题解决了么?
还没是搞好,最后还是以多个版本的形式给出去! 是没法改,上次玩320240的触摸屏,参数也是预编译的,结果改了预定义之后,生成的lib不相应的改变......
我觉得索性就不要预编译了,直接定义个变量吧,每次给变量赋个初值好了...... 听说是可以的,现在的编译器可以做到。但没时间钻研这编译器手册。 lib不能改是当然的,已经编译好生成的lib在你修改过.h那些文件再次编译时候并不会再次参与编译了,因为lib不会被逆向还原的。只能通过变量来做传递条件,预定义和常量是改不了的。 Eiman 发表于 2013-12-30 09:36
lib不能改是当然的,已经编译好生成的lib在你修改过.h那些文件再次编译时候并不会再次参与编译了,因为lib ...
不是改变Lib,而是按自己设定的条件抽取自己要的内容而已! 其实你用条件编译就是要改变lib的,除非使用变量传递方式就不用改变lib了。 可以的,我一般这样做:
头文件里:
//#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
…… Eiman 发表于 2013-12-30 09:40
其实你用条件编译就是要改变lib的,除非使用变量传递方式就不用改变lib了。 ...
我的目的是生成一个Lib,就可用这个Lib替代源码。用在其它工程上,所以,其它工程只是对这个Lib读取,而非修改喔. mhw 发表于 2013-12-30 10:01
可以的,我一般这样做:
头文件里:
当然,直接用源码编译是不存在这个问题的。
生成Lib之后,去掉源码,直接用Lib编译,你再配置你这个头文件,看能不能实现裁剪? yoje 发表于 2013-12-30 11:33
当然,直接用源码编译是不存在这个问题的。
生成Lib之后,去掉源码,直接用Lib编译,你再配置你这个头文 ...
如果不把整个工程生成库,而把核心的.c文件生成库,而源程序中保留条件编译,这样不就可以了? TongIC 发表于 2013-12-30 12:33
如果不把整个工程生成库,而把核心的.c文件生成库,而源程序中保留条件编译,这样不就可以了? ...
这样与所有源码生成库,是没有本质区别的。试过,也是不行的! 本帖最后由 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。 yoje 发表于 2013-12-30 11:33
当然,直接用源码编译是不存在这个问题的。
生成Lib之后,去掉源码,直接用Lib编译,你再配置你这个头文 ...
看来你没理解什么叫条件编译……
条件编译就是把多余的代码通过宏开关屏蔽掉,不参与生成目标代码(bin或lib)……所以你的要求是不可能实现的。如果图自己方便就把所有的函数都生成一个lib,用户编译时,编译器会自动把用不到的功能优化掉;否则就自己编译出N个版本的lib……
页:
[1]