C++-связывание сборки на x86/ubuntu - неопределенная ссылка на ThreadRoot, SWITCH

Я создаю исходный код Nachos на Ubuntu 12.04.

Если верить выводу "lscpu", то машинная арка - это x86. Я получаю следующую ошибку на последнем шаге make:

$ сделать

g++ -m32 -P -I../сеть -I../filesys -I../userprog -I../threads -I../machine -I../lib -iquote -Dx86 -DLINUX -c . ./потоки/переключатель.S

g++ bitmap.o debug.o libtest.o sysdep.o прерывание.o статистика.o таймер.o консоль.o машина.o mipssim.o перевод. .o synch.o thread.o адресное пространство.o исключение.o synchconsole.o каталог.o filehdr.o filesys.o pbitmap.o openfile.o synchdisk.o post.o переключатель.o -m32 -o nachos

scheduler.o: В функции «Scheduler::Run(Thread*, bool)»:

/home/userx/nachos/NachOS-4.0/code/build.linux/../threads/scheduler.cc:133: неопределенная ссылка на `SWITCH'

thread.o: в функции `Thread::StackAllocate(void ()(void), void*)':

/home/userx/nachos/NachOS-4.0/code/build.linux/../threads/thread.cc:345: неопределенная ссылка на `ThreadRoot'

/home/userx/nachos/NachOS-4.0/code/build.linux/../threads/thread.cc:356: неопределенная ссылка на `ThreadRoot'

collect2: ld вернул 1 статус выхода make: * [nachos] Ошибка 1 $

Вот switch.S с символом defs --

/* We define two routines for each architecture:
 *
 * ThreadRoot(InitialPC, InitialArg, WhenDonePC, StartupPC)

<...>

#ifdef SOLARIS
  .globl  ThreadRoot
  ThreadRoot:
#else
  .globl  _ThreadRoot
  _ThreadRoot:
#endif

#ifdef x86
    .text
    .align  2
  .globl  ThreadRoot
  .globl  _ThreadRoot
  _ThreadRoot:
  ThreadRoot:
  <...>
    .globl  SWITCH
  .globl  _SWITCH
  _SWITCH:
  SWITCH:
  <...>
#endif

Я пропустил #ifdefs для большего количества архитектур, таких как DECMIPS, POWERPC, APPLEPOWERPC и т. д. Да, мой env $PATH включает каталог, в котором находится switch.s:/home/userx/nachos/NachOS-4.0/code/threads/ Пожалуйста, дайте мне знать если для отладки требуется дополнительная информация. Большое спасибо.


person user2732244    schedule 12.01.2014    source источник


Ответы (1)


Попробуйте добавить подчеркивание в заголовочный файл C, у которого есть extern «C» SWITCH и ThreadRoot, а также изменить файл .c, в котором находится ошибка. Я имею в виду использование _SWITCH вместо SWITCH и то же самое для ThreadRoot.

person Pedro Muñoz    schedule 22.05.2014