我看书上的C语言例程是调用了printf函数的。
但我编的一个小程序里却因为调用了printf函数,而链接不成功。
我的程序框架是这样的:
#include "regs2407.h"
#include "stdio.h"
void main(void)
{
…… ;初始化
int i,j, c;
i = 1;
j = 2;
c = i+j;
printf("%d", c);
}
cmd文件:
MEMORY
{
PAGE 0 : VECS : origin = 0h , length = 040h /* VECTORS */
PROG : origin = 40h , length = 0FFC0h /* PROGRAM */
PAGE 1 : MMRS : origin = 0h , length = 060h /* MMRS */
B2 : origin = 0060h , length = 020h /* DARAM */
B0 : origin = 0200h , length = 0100h /* DARAM */
B1 : origin = 0300h , length = 0100h /* DARAM */
DATA : origin = 8000h , length = 8000h /* XDM */
}
SECTIONS
{
.text :{}> PROG PAGE 0
.cinit :{}> PROG PAGE 0
.data :{}> DATA PAGE 1
.stack :{}> DATA PAGE 1
.bss :{}> B0 PAGE 1
.vectors:{}> VECS PAGE 0
}
注:cmd文件不是我自己写的,是从ti上下的例程中照搬过来的。
但build时编译器总是出现这样的错误提示:
>> cannot allocate .bss in B0 (page 1)
>> errors in input - SumTest.out not built
Build Complete,
2 Errors, 0 Warnings.
把printf注释掉编译就通过了。
请问各位高手,这是什么原因?究竟能不能调用printf函数?
回复:请教:CC里可以调用printf函数吗?
把SECTION中的B0换成DATA,也就是说吧.BSS分配到大一点的空间。试试!
回复:回复:回复:请教:CC里可以调用printf函数吗?
不好意思,这个我也不太清楚,
请教walker吧,他可能知道
回复:回复:请教:CC里可以调用printf函数吗?
我试过了,确实如你所言。
可是,您能告诉我为什么吗?调用printf与.bss的大小有什么关系?.bss块不是给全局变量和静态变量分配空间的吗?为什么又涉及到printf的调用?
多谢指点!
回复:回复:回复:请教:CC里可以调用printf函数吗?
因为printf函数本身需要用一些变量,它还需要调用其他一些函数,这些函数也需要用一些变量,大致有下面这些,你可以从你的.map文件中看到.
000029f7 00000003 : printf.obj (.bss)
000029fa 0000008d : _printfi.obj (.bss)
00002a87 00000001 : atoi.obj (.bss)
00002a88 00000101 : ctype.obj (.bss)
00002b89 000001cd : defs.obj (.bss)
00002d56 00000068 : ecvt.obj (.bss)
00002dbe 00000068 : fcvt.obj (.bss)
00002e26 00000001 : fputc.obj (.bss)
00002e27 00000002 : fputs.obj (.bss)