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

2020-01-26 12:54发布


很喜欢KEIL UV4新版本的界面,但试装了几个总不成功。在不同的电脑上装了9.06和最新的9.51a版本,编译在原来9.01版上正常的项目,总是会弹出一大堆的链接错误:*** ERROR L121: IMPROPER FIXUP
未命名1.JPG (152.07 KB, 下载次数: 0) 下载附件 LX51选项 2013-4-24 10:41 上传
我觉得不像是破解的问题,因为我采用评估版的程序编译代码小于2K的程序,仍然有这个问题,勾选LX51选项,错误消失。
有没有人遇到和我相同的问题,为什么我这种现象在网上也搜不到,还请高手解惑?我其实就想尝试一下高版本的,而9.01版的确实没这个问题。

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
4条回答
NemoGu
1楼-- · 2020-01-26 18:40
Keil官網上對於L121的錯誤有些解釋,給你兩個參考鏈接:
http://www.keil.com/support/docs/1270.htm
http://www.keil.com/forum/4864/
souching
2楼-- · 2020-01-26 23:00
找到问题所在了。
我为了模块化编程的方便,让每个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居然又有了新问题,而两个问题居然同源,这也算意外的收获吧。
至于为什么会这样,还请方家指教!
guanjinwei1989
3楼-- · 2020-01-27 00:57
 精彩回答 2  元偷偷看……
csb1030
4楼-- · 2020-01-27 05:22
c51吗??网上有比较多啊

一周热门 更多>