LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1210|回复: 2

请教链接时说"Undefined symbol _printf...."

[复制链接]
发表于 2005-4-9 08:54:50 | 显示全部楼层 |阅读模式
linux0.11下,我编了个简单的hello.c程序,想了解main()怎样编译、链接成可执行程序的:
#include "stdio.h"
int main()
{
char c;
while(1)
{
   scanf("%c",&c);
   printf("%c",c);
}
return 0;
}
1、使用gcc -o hello hello.c,一切正常,但是这太智能了,我无法了解hello生成的大概过程
2、现在把编译、链接分开:
a.  gcc -Wall -O -fstrength-reduce -fomit-frame-pointer -fcombine-regs\
-c -o hello.o hello.c
b.  gld -s -x -M -o hello /usr/local/lib/crt0.o -L/usr/local/lib/ -lc \
hello.o

问题出在步骤b,出现错误:“Undefined symbol _printf...”和“Undefined symbol _scanf...”。请问printf、scanf在哪个库呢?有没有什么命令能查到它们在哪?GCC有没有什么选项能把它执行过程中使用到的库列出来吗?
发表于 2005-4-9 10:24:47 | 显示全部楼层
这个倒没有仔细想过。
你nm hello,就会看到,
       U printf@@GLIBC_2.0

所以说printf是glibc提供的吧。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-4-9 12:11:50 | 显示全部楼层
谢谢Glue.
问题解决了:把原来的“gld -s -x -M -o hello /usr/local/lib/crt0.o -L/usr/local/lib/ -lc \
hello.o”换成“gld -s -x -M -o hello /usr/local/lib/crt0.o -L/usr/local/lib/  \
hello.o -lc”就行了(把hello.c和-lc的顺序换了一下)。不知道是不是版本太低的原因,我看ld手册说不在乎顺序的
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表