链接器不承认外部声明

时间:2011-06-28 22:46:07

标签: c gcc ld extern

我正在osdever关注内核开发教程,我正在打印到本教程的屏幕部分。它编译得很好,没有错误或警告,但是当它进行链接时,我得到:

screen.o: In function `scroll':
screen.c:(.text+0x12c): undefined reference to `memcpy'
screen.o: In function `put_str':
screen.c:(.text+0x249): undefined reference to `strlen'

我在screen.c的顶部对system.h有一个include语句,在system.h中我有

#ifndef __SYSTEM_H
#define __SYSTEM_H

extern unsigned char *memcpy(unsigned char *dest, const unsigned char *src, int count);
extern unsigned char *memset(unsigned char *dest, unsigned char val, int count);
extern unsigned short *memsetw(unsigned short *dest, unsigned short val, int count);
extern int strlen(const char *str);
extern unsigned char inportb (unsigned short _port);
extern void outportb (unsigned short _port, unsigned char _data);
extern void clear();
extern void put_char(unsigned char c);
extern void put_str(unsigned char *str);
extern void set_color(unsigned char fcol, unsigned char bcol);
extern void init_video();

#endif

我在网上找不到任何相关信息,教程中没有任何帮助。当我在链接器语句中更改顺序时,似乎来自

/usr/local/cross/bin/i586-elf-ld -T link.ld -o kernel.bin start.o main.o screen.o

/usr/local/cross/bin/i586-elf-ld -T link.ld -o kernel.bin start.o screen.o main.o

我得到了

screen.o: In function `put_str':
screen.c:(.text+0x249): undefined reference to `strlen'
main.o: In function `main':
main.c:(.text+0x9b): undefined reference to `init_video'

修改 http://pastebin.com/ibBAVpe5 - Main.c

1 个答案:

答案 0 :(得分:4)

您还没有提供strlen,所以它究竟应该来自哪里?在正常编译中,ld命令行将-lc添加cc以引入标准库。鉴于有迹象表明这是独立的,您需要提供自己的支持例程,例如strlenmemcpy;你不能使用标准的C库(或者必须非常小心)因为它会尝试调用内核来处理某些事情。

这不能解释重新排序对象的其他问题,也不能解释下面评论中的讨论。这让我相信你有一个破碎的或可能不兼容的链接描述文件(-T link.ld)。粘贴?