yoje 发表于 2013-5-14 11:14:32

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

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

ijlc1314 发表于 2013-5-14 12:06:42

呵呵,关注

yoje 发表于 2013-5-14 17:41:56

自己顶!{:time:}

yoje 发表于 2013-5-18 16:20:11

AVT-DENG 发表于 2013-5-18 11:26 static/image/common/back.gif
是因为你生成库的方式不对
条件编译(#DEFINE)
与库(LIBRARY)是两个完全不同的概念.


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

leirui001 发表于 2013-5-18 17:18:20

有价值
记号一下
等懂得人回答

xiaomu 发表于 2013-5-18 17:23:51

你是怎样编译的lib, 重新编译lib的时候, 先进行一次 clean的操作,把原来生成的目标文件全部清理掉,
然后重新编译, 应当就不会出现了, 首先要保证你的条件编译的条件正确, 比如#ifdefine 和 #if 的区别,

yoje 发表于 2013-5-19 14:58:25

xiaomu 发表于 2013-5-18 17:23 static/image/common/back.gif
你是怎样编译的lib, 重新编译lib的时候, 先进行一次 clean的操作,把原来生成的目标文件全部清理掉,
然 ...

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

yoje 发表于 2013-5-20 15:41:33

xiaomu 发表于 2013-5-18 17:23 static/image/common/back.gif
你是怎样编译的lib, 重新编译lib的时候, 先进行一次 clean的操作,把原来生成的目标文件全部清理掉,
然 ...

兄弟,问题如故。

yoje 发表于 2013-5-20 15:44:11

生成库的方式,我用这个(由于上传图片不方便,我直接给网址好了):
http://blog.sina.com.cn/s/blog_66ec8d880100hfo5.html

xiaomu 发表于 2013-5-20 16:18:25

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, 定义你要编译的条件,

yoje 发表于 2013-5-20 17:46:43

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不能裁剪而源码则可以)。

yoje 发表于 2013-5-21 21:36:37

AVT-DENG 发表于 2013-5-18 11:26 static/image/common/back.gif
是因为你生成库的方式不对
条件编译(#DEFINE)
与库(LIBRARY)是两个完全不同的概念.


请问,按你的方式,应怎样生成?{:handshake:}

yoje 发表于 2013-6-7 10:21:30

问题还没解决,不知如何把它设置为悬赏模式?
“重复发帖,将会被封锁ID”!!!

TongIC 发表于 2013-12-29 19:54:55

最近也在查看IAR生成库的方式,楼主的问题解决了么?

yoje 发表于 2013-12-30 08:49:40

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

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

ada1983 发表于 2013-12-30 09:10:10

是没法改,上次玩320240的触摸屏,参数也是预编译的,结果改了预定义之后,生成的lib不相应的改变......

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

yoje 发表于 2013-12-30 09:23:54

听说是可以的,现在的编译器可以做到。但没时间钻研这编译器手册。

Eiman 发表于 2013-12-30 09:36:35

lib不能改是当然的,已经编译好生成的lib在你修改过.h那些文件再次编译时候并不会再次参与编译了,因为lib不会被逆向还原的。只能通过变量来做传递条件,预定义和常量是改不了的。

yoje 发表于 2013-12-30 09:38:05

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

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

Eiman 发表于 2013-12-30 09:40:06

其实你用条件编译就是要改变lib的,除非使用变量传递方式就不用改变lib了。

mhw 发表于 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

……

yoje 发表于 2013-12-30 11:28:19

Eiman 发表于 2013-12-30 09:40
其实你用条件编译就是要改变lib的,除非使用变量传递方式就不用改变lib了。 ...

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

yoje 发表于 2013-12-30 11:33:05

mhw 发表于 2013-12-30 10:01
可以的,我一般这样做:

头文件里:


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

TongIC 发表于 2013-12-30 12:33:57

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

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

yoje 发表于 2013-12-30 13:23:31

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

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

Eiman 发表于 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。

mhw 发表于 2013-12-30 14:21:17

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

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

条件编译就是把多余的代码通过宏开关屏蔽掉,不参与生成目标代码(bin或lib)……所以你的要求是不可能实现的。如果图自己方便就把所有的函数都生成一个lib,用户编译时,编译器会自动把用不到的功能优化掉;否则就自己编译出N个版本的lib……
页: [1]
查看完整版本: IAR关于生成.Lib时,功能裁剪不掉?