Как исправить ошибку компоновщика при компиляции XV6? - PullRequest
0 голосов
/ 26 ноября 2018

В моем XV6 есть три файла: testmain.c, foo.h и foo.c:

foo.h:

extern void myfunction(void)

foo.c:

#include "foo.h"
void myfunction(void){
   printf(1, "HelloWorld"); }

testmain.c:

 #include "foo.h" 
 int main(void){
    myfunction();
    return 0 ; }

Я получаю неопределенную справочную ошибку для myfunction () в test_main.Я знаю, что мне нужно что-то изменить в Makefile для XV6, но я не знаю что.вот что я изменил в XV6 Makefile:

UPROGS=\
    _cat\
    _echo\
    _forktest\
    _grep\
    _init\
    _kill\
    _ln\
    _ls\
    _mkdir\
    _rm\
    _sh\
    _stressfs\
    _usertests\
    _wc\
    _zombie\ 
    _foo\
    _testmain\

1 Ответ

0 голосов
/ 26 ноября 2018

Вам необходимо внести несколько изменений в Makefile:

  • Укажите, что вы хотите создать _testmain программу,
  • Скажите, что такое зависимости _testmain (если применимо).

добавить _testmain в список программ:

UPROGS=\
    _testmain\
    _cat\
    _crash\ 
    _echo\
    _factor\
    ....

_testmain зависимости:

Поскольку ваша _testmain программа зависит от двух файлов, вы должнысоздайте специальное правило, сообщающее об этом строителю (я делаю это правило из _%: %.o $(ULIB) rule):

_testmain: testmain.o foo.o $(ULIB)

    $(LD) $(LDFLAGS) -N -e main -Ttext 0x1000 -o $@ $^
    $(OBJDUMP) -S $@ > $*.asm
    $(OBJDUMP) -t $@ | sed '1,/SYMBOL TABLE/d; s/ .* / /; /^$$/d' > $*.sym
...