打印

求助,KEIL UV4新版本链接报错

[复制链接]
1974|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 souching 于 2013-4-24 14:29 编辑

很喜欢KEIL UV4新版本的界面,但试装了几个总不成功。在不同的电脑上装了9.06和最新的9.51a版本,编译在原来9.01版上正常的项目,总是会弹出一大堆的链接错误:*** ERROR L121: IMPROPER FIXUP

在网上也找不到解决的办法,而当我在OPTIONS FOR TARGET窗口中勾选LX51代替BL51时,则原来的连接错误全部消失。但网上说LX51是在ROM大于64K时使用的,所以我觉得这种方法不见得是正确的。

我觉得不像是**的问题,因为我采用评估版的程序编译代码小于2K的程序,仍然有这个问题,勾选LX51选项,错误消失。
有没有人遇到和我相同的问题,为什么我这种现象在网上也搜不到,还请高手解惑?我其实就想尝试一下高版本的,而9.01版的确实没这个问题。

相关帖子

沙发
ayb_ice| | 2013-4-24 14:34 | 只看该作者
L51与LX51本身就不同的,
好象语法都不一样的

另外A51与AX51也是有区别的

使用特权

评论回复
板凳
souching|  楼主 | 2013-4-24 14:38 | 只看该作者
我也觉得那样不靠谱,不知道有没有人用新版本时碰到和我相同的问题?怎么我在网上也找不到和我类似问题的说明

使用特权

评论回复
地板
王项电子| | 2013-4-24 21:38 | 只看该作者
我的电脑安装了UV4,无法使用查找功能。

使用特权

评论回复
5
souching|  楼主 | 2013-4-25 09:14 | 只看该作者
楼上用的是哪个版本?

使用特权

评论回复
6
souching|  楼主 | 2013-4-25 11:55 | 只看该作者
找到问题所在了。
我为了模块化编程的方便,让每个C文件对应一个H头文件,头文件除了供给自身的C文件使用外,还用于其他C文件的使用。
譬如说对于key.c文件,开头是这样的,里面本身有全局变量和函数的定义:
#include "key.h"
bdata bit g_bSetKeyVal,g_bUpKeyVal,g_bDownKeyVal;
void SetKeyScan(void)
{
...
}
然后在key.h里我对全局变量和函数进行声明(当然有#ifndef,#endif之类的,这里只是略写):
extern bdata bit g_bSetKeyVal,g_bUpKeyVal,g_bDownKeyVal;
extern void SetKeyScan(void);
这个key.h对于key.c的作用只是用于函数的声明,而全局变量的声明则用于其他文件的使用,这样做只是为了方便,想用一个头文件来满足本文件和其他文件的使用。譬如说在main.c的开头也可以这样调用:
#include "key.h"

而我的问题恰恰就出在这个上面。
我发现当我在key.h里的全局变量声明里如果位变量采用这种方式声明时:(经验证,即使不用头文件,直接在C中这样声明也有这样的问题)
extern bdata bit g_bSetKeyVal,g_bUpKeyVal,g_bDownKeyVal;
就会在链接时出现*** ERROR L121: IMPROPER FIXUP的错误。(错误处就是所有对外部位变量进行调用的地方)
而当我把声明中的bdata去掉,即按下面的方式声明:
extern bit g_bSetKeyVal,g_bUpKeyVal,g_bDownKeyVal;
错误就会完全消失。而声明非bit的类型则不会有这个问题。

这个问题只在我在测试C51 9.06和9.51a时会出现,但在9.01版本里不会报链接错误,但我同时发现位全局变量如果赋有初值时,则初值会消失。譬如上面位定义如下时:
bdata bit g_bSetKeyVal=1,g_bUpKeyVal=1,g_bDownKeyVal=1;
在9.01虽然可以正常编译链接通过,而全局变量没有执行初始化。
我本来就是要查这个问题的原因的,没想到换了个新版本的keil居然又有了新问题,而两个问题居然同源,这也算意外的收获吧。至于为什么会这样,还请方家指教!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

22

帖子

2

粉丝