关于KEIL工程中自建Lib产生的问题的疑问,请教了!
在一个项目中,最开始是代码都写成C文件和H文件,编译都通过了,项目也调试通过了;后来件网上有做成Lib使用的文章,也尝试了一下,把整个项目做了一个Lib文件,然后在原来的...
在一个项目中,最开始是代码都写成C文件和H文件,编译都通过了,项目也调试通过了;后来件网上有做成Lib使用的文章,也尝试了一下,把整个项目做了一个 Lib 文件,然后在原来的工程文件中添加进Lib文件,删除C文件,只保留了含main的C文件,编译时也通过了,没有错误,警告之类的原来本身也有就没有管。下载到MCU时发现有些功能没有了,比如工作指示灯,MCU正常工作时会按一定的频率闪烁,使用 Lib 后不在闪烁了;还有就是编译出来的代码量也不一样了,没使用 Lib 之前大约有32K左右,使用Lib文件后大约只有29K左右,这是怎么回事?求教各位高手,第一次使用自制 Lib 文件
展开
若以下回答无法解决问题,邀请你更新回答
1个回答
展开全部
代码少了,说明有些改成 Lib的函数没有被调用,导致有些功能没有了,而那些警告就是主程序中要调用的函数命令是错误的,即是有调用的语句,但是所调用的函数找不到。
原因是生成Lib文件后的函数没有用extern声明成外部函数。
凡是在Lib文件中函数,一律需要在主程序的前面用extern声明成外部函数,函数的形式就是原来用C语言写的子函数时调用的形式。
例如:extern void led(void); 每一行都要带分号, 这是一个无调用参数,无返回参数的函数。如果有就加上。
原因是生成Lib文件后的函数没有用extern声明成外部函数。
凡是在Lib文件中函数,一律需要在主程序的前面用extern声明成外部函数,函数的形式就是原来用C语言写的子函数时调用的形式。
例如:extern void led(void); 每一行都要带分号, 这是一个无调用参数,无返回参数的函数。如果有就加上。
更多追问追答
追问
先谢你的回答!
在保留的C文件里(或H文件)用extern声明要调用的函数,这个好理解;若在封装在Lib里的C文件(不是在保留的C文件里)中有相互调用的函数,是不是有可能不会被编译进代码中?或是其他情况。另定义在H文件中的变量或IO口等在封装在Lib里的C文件里调用,也有可能不被编译进代码,工作指示灯感觉就是这样的
追答
封装在Lib里的C文件中有相互调用的函数,也同样需要extern声明成外部函数的。
你可以查一下吗,你说的:工作指示灯不在闪烁了,是不是属于互相调用的情况。
为了避免IO口调用错误,一律在主程序中定义。
至于在定义在H文件中的变量,就看原来的C程序,互相调用时,是怎么声明的,也可以调用的话就没有问题。
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询