为什么在KEIL上能编译成功而在vc++上编译不成功

为什么在KEIL上能编译成功而在vc++上编译不成功,第1张

因为KEIL使用的C51语言虽然源自于标准C,但基于51单片机的硬件做了很多针对性的扩展,这些扩展只能被KEIL C编译器识别,而VC++的编译器只能识别标准C,对于C51中的扩展不认识,当然要报错了。

“此电脑”右键 -> 属性 -> 高级系统设置 -> 高级 -> “性能”设置 -> 数据执行保护,选择仅为基本windows程序和服务启用DEP,或者在下面非DEP的列表里添加Keil软件的C51编译器就可以了。
因为DEP是数据执行保护机制,它的保护下,应用程序的有些 *** 作是不允许执行的。

编译生成的文件:plg;编译器编译结果hex和bin;可执行文件:map和lst。
程序员将产品的逻辑 *** 作抽象为C代码,然后通过编译器的编译和链接,生成微处理器可执行的机器码。
在典型的应用程序中,编译器或汇编器将程序的源代码(例如C或汇编语言)转换为机器代码,并将其输出到一个文件中。然后,这个文件由程序员导入,以将机器代码“烧录”到ROM中,或传输到目标系统以进行加载和执行,这个存放机器码的文件就是烧录文件。

在C语言里,如果直接写P10,C编译器并不能识别,而且P10也不是一个合法的C语言变量名,所以得给它另起一个名字,这里起的名为led,可是led是不是就是P10呢?你这么认为,C编译器可不这么认为,所以必须给它们建立联系,这里使用了Keil C的关键字sbit来定义

但sbit 要在最外面定义,就是说必须定义成外部变量因此不能放到main函数里面,这样就是局部变量了。
望采纳!

点击全局编译按钮
,完成后在相应目录文件夹(之前存放hex文件的路径)下即可看到生成的ethernetlib文件。
6、lib文件生成后,还需h文件,h文件有两种方式,一种是保留之前c文件对应的h文件,继续照常使用,另一种是可将单独的h文件合并成一个新的etherneth,直接在mainc调用etherneth即可。
7、将lib文件剪切放到Ethernet文件路径下,将之前的socketc、w5500c等文件删除掉,头文件换成etherneth,工程里将ethernetlib加入到group(ethernet文件夹)里。
8、将取消编译的文件重新打开,将编译后文件类型改回hex文件,然后全编译,没有错误即完成。
另外,若想将一个c文件生成一个lib文件,只需保留该c文件进行编译,h文件也保持不变,将工程中原先的c文件替换成lib文件即可。
用心写好每篇文章,分享给需要的你☺,如果对您有用希望能留下您的脚印(点赞/评论/收藏)!
stm32
c语言
keil mdk
嵌入式
注意!注意!你有一个手机待领取
巨摩互动
广告
Keil对lib封装库反汇编成C语言pdf
502下载·22评论
2013年5月6日
把c++的exe工程编译为动态库dll静态库lib,并实现调用(超详细)
2087阅读·0评论·1点赞
2020年8月28日
源代码封装成库Lib的方法
504阅读·0评论·0点赞
2022年10月14日
STM32/keil把多个c文件编译为静态库lib
2190阅读·0评论·6点赞
2021年1月5日
C/C++ 静态库(lib)的概念和使用方法
3432阅读·0评论·4点赞
2022年5月2日
Keil 下生成LIB库文件以及如何使用LIB库文件
732阅读·1评论·0点赞
2020年12月19日
注意!注意!你有一个手机待领取
巨摩互动
广告
C语言 之 编译自己的lib库
1457阅读·0评论·1点赞
2020年8月7日
CMake交叉编译简单教程
32W阅读·2评论·14点赞
2018年9月7日
如何将c语言封装成dll文件,封装动态库dll与静态库lib(原理及简单实例)
2069阅读·0评论·1点赞
2021年5月21日
keil C对lib封装库反汇编成C语言,Keil软件“C语言”及“汇编”混编 —— 相关知识整理doc
1587阅读·0评论·0点赞
2021年5月21日
keil 加密:编译代码成lib库
454阅读·0评论·0点赞
2022年7月28日
Keil C 里面Lib库文件的生成与调用
11下载·0评论
2020年8月4日
keil C对lib封装库反汇编成C语言
101下载·4评论
2011年4月8日
C语言编译lib库手动添加
1888阅读·0评论·0点赞
2017年6月18日
基于Keil下多文件打包生成Lib库文件的具体 *** 作
2667阅读·3评论·2点赞
2020年1月18日
Windows DOS命令行编译C/C++程序----库文件lib的链接
1752阅读·0评论·0点赞
2019年2月21日
keil把源代码生成lib的方法
2754阅读·0评论·6点赞
2022年1月25日
keil 编译生成 lib文件
2244阅读·4评论·1点赞
2018年1月8日
keil多文件编译
724阅读·0评论·1点赞
2022年4月3日
在keil中将文件封装为lib库文件需要注意的地方
1395阅读·0评论·0点赞
2021年11月15日
去首页
看看更多热门内容
评论1
YJer

你好,第6点中提到的,将单独的h文件合并成一个新的etherneth,

你只是打开了源文件,但是没有将源文件导入你的工程,所以提示这个错误
导入文件的选项在右边project框里面,右键点Source Group 1,选Add Files 添加你的源文件就行了

这问题我之前也遇到过,估计是你的keil c的版本问题,现在的keil c90应该没有这个问题了,你可以试一下。 另外,估计跟你的软件代码的长短也有问题,如果软件代码很大的话,那编译起来也是需要点时间的喔,希望能帮到你!

链接中给出代码,经过编译,没有显示任何错误。
复制粘贴如下:
#include <reg52h>
#include <intrinsh>
unsigned char tmp;
unsigned int c=0;
sbit led1=P2^0; //指示灯0
sbit led2=P2^1; //指示灯1
sbit led3=P2^3; //指示灯3
void init(); //串口初始化
void send(unsigned char a); //单字节发送函数
void ctrl(); //接收处理函数
void main()
{
init();
while(1)
{
if(RI==1) //是否有数据到来
{
RI = 0;
tmp = SBUF; //暂存接收到的数据
ctrl();
}
}
}
void init() //串口初始化
{
ES=0; //关中断
SCON = 0x50; // REN=1允许串行接受状态,串口工作模式1,
//10位UART(1位起始位,8位数据位,1位停止位,无奇偶校验),波特率可变
TMOD = 0x20; //定时器1工作于方式2,8位自动重载模式,用于产生波特率
TH1=TL1=0xFD; //波特率9600 (本次测试采用晶振为110592)
PCON &= 0x7f; //波特率不倍增
TR1 = 1; //定时器1开始工作,产生波特率
//发送标志位置0
TI=0; //接收标志位置0
RI=0;
//EA=0;
ES=1;
led1=0; //初始化设置3个指示灯全亮
led2=0;
led3=0;
}
void send(unsigned char a) //单字节数据发送
{ //注意:若单片机TXD(P31)无上拉能力,必须在P31端接上拉电阻。本次测试需要接上拉电阻
TI=0;
SBUF=a;
while(TI==0);
TI=0;
if(c%2) //发送指示灯标志,每接收一次,此灯亮灭交替
led3=1;
else
led3=0;
c++;
}
void ctrl() //接收处理函数
{
switch(tmp)
{
case '1':
led1=1; //收到字符1,指示灯0灭
send(tmp);
break;
case '2': //收到字符2,指示灯1灭
led2=1;
send(tmp);
break;
case '3': //收到字符3,指示灯0、1亮
led1=0;
led2=0;
send(tmp);
break;
case '4': //收到字符4,指示灯0、1灭
led1=1;
led2=1;
send(tmp);
break;
case '5': //收到字符5,指示灯3亮
led3=0;
send(tmp);
break;
default: //其他,灯全灭
led1=1;
led2=1;
led3=1;
send(tmp);
}
}
上述代码,没有任何修改,完全是题目链接里面所给出的。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zz/13495294.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-08-18
下一篇 2023-08-18

发表评论

登录后才能评论

评论列表(0条)

保存