如何将c目标文件与c ++目标文件链接?

时间:2019-07-09 16:40:29

标签: c++ c linker extern object-files

我正在写显示“ Hello world!”的小“内核”。屏幕上。我有工作的putc(put char)函数,所以我可以用12个putc函数调用来做到(我做到了),但是我想用puts(put string)函数来实现,我想用C ++编写。我知道我可以用C语言实现它,但是将来我将需要使用C ++链接进行C语言...那为什么现在不这样做呢?

这是我的kernel.c代码:

extern void putc(char, char);
extern void puts(char*, char);
extern void clear(void);

void start_kernel(void)
{

  clear();
  puts("Hello world!", 7);
  putc('H', 7);
  putc('e', 7);
  putc('l', 7);
  putc('l', 7);
  putc('o', 7);
  putc(' ', 7);
  putc('w', 7);
  putc('o', 7);
  putc('r', 7);
  putc('l', 7);
  putc('d', 7);
  putc('!', 7);

  for(;;);

}

我更改了puts.cpp代码,以便它应该在屏幕上显示字符串的第一个字母...但是没有... puts.cpp:

extern "C" void putc(char, char);

extern "C"
{

  void puts(char *s, char color)
  {

    putc(*s, 7);

  }

}

link.bash脚本:

nasm start.asm -f elf64 -o start.o
nasm putc.asm -f elf64 -o putc.o
nasm clear.asm -f elf64 -o clear.o
gcc puts.cpp -std=c++0x -c -o puts.o
gcc kernel.c -O3 -fomit-frame-pointer -masm=intel -c -o kernel.o
ld -Tkernel.ld -o kernel.bin start.o kernel.o putc.o puts.o clear.o

用qemu-system-x86_64 -hdd kernel.iso生成iso运行它之后,它显示奇怪的字符(每次相同)和Hello world! 当然,将此功能放入kernel.c文件后,它会显示HHello世界!

有趣的是,用clang ++(对于puts.cpp)替换gcc后,它会显示另一个奇怪的字符(每次都相同)

有人可以告诉我如何正确链接此文件吗?

编辑:

在用putc('a',7)替换puts()函数内容之后,我忘了补充一点;它正确显示了此字母,这是参数有问题。

0 个答案:

没有答案