This question already has answers here:
What is an undefined reference/unresolved external symbol error and how do I fix it?
                                
                                    (32个答案)
                                
                        
                                6年前关闭。
            
                    
我正在尝试将被黑客入侵的程序移植到GDB-7.6.1。以前在GDB-3.2.2下很好。
但是,尽管我没有碰到任何与这些宏定义的变量有关的东西,但还是遇到了一些编译错误。最重要的是,Makefile中的相关句子是相同的。但是objdump显示它们在宏变量中是不同的。

配置完成后,编译器会报错

libsim.a(engine.o): In function `delayslot32':
/home/ruizhewu/work/gdb/gdb761-5-M3/gdb-7.6.1/lx-bcm-sc/sim/mips/../../../sim/mips/mips.igen:77: undefined reference to `SC_PRE_PROC_DELAY_SLOT'
/home/ruizhewu/work/gdb/gdb761-5-M3/gdb-7.6.1/lx-bcm-sc/sim/mips/../../../sim/mips/mips.igen:85: undefined reference to `SC_POST_PROC_DELAY_SLOT'


bash-3.2$ objdump -t libsim.a |less

........

support.o:     file format elf64-x86-64

SYMBOL TABLE:

000000000000021d g     F .text  00000000000000bd delayslot32
0000000000000000         *UND*  0000000000000000 SC_PRE_PROC_DELAY_SLOT


engine.o:     file format elf64-x86-64

SYMBOL TABLE:
000000000000d72f l     F .text  00000000000000bd delayslot32

...

...

...


0000000000000000         *UND*  0000000000000000 SC_PRE_PROC_DELAY_SLOT


上一个程序engine.o仅具有delayslot32,但没有SC_PRE_PROC_DELAY_SLOT

mips.igen代码为:

:function:::address_word:delayslot32:address_word target
{
  instruction_word delay_insn;
  SC_PRE_PROC_DELAY_SLOT(SD, CIA);
  sim_events_slip (SD, 1);
  DSPC = CIA;
  CIA = CIA + 4; /* NOTE not mips16 */
  STATE |= simDELAYSLOT;
  delay_insn = IMEM32 (CIA); /* NOTE not mips16 */
  idecode_issue (CPU_, delay_insn, (CIA));
  STATE &= ~simDELAYSLOT;
  SC_POST_PROC_DELAY_SLOT(SD);
  return target;
}


makefile实际上与gdb3.2.2下的程序相同:

sim / mips / Makefile:

semantics.o: sim-main.h scSupport.h adslExtension.h semantics.c $(SIM_EXTRA_DEPS)
engine.o: sim-main.h scSupport.h adslExtension.h engine.c $(SIM_EXTRA_DEPS)
support.o: sim-main.h support.c $(SIM_EXTRA_DEPS)
idecode.o: sim-main.h scSupport.h adslExtension.h idecode.c $(SIM_EXTRA_DEPS)
itable.o: sim-main.h itable.c $(SIM_EXTRA_DEPS)
scSupport.o: scSupport.h adslExtension.h scSupport.c $(SIM_EXTRA_DEPS)


未定义的变量,编译器抱怨的实际上是在其中定义的
scSupport.h

#define SC_PRE_PROC_DELAY_SLOT(sd, cia)         scEventEndOfInstExe(sd, cia)
#define SC_POST_PROC_DELAY_SLOT(sd)

最佳答案

在我看来,头文件scSupport.h并未包含在使用宏的文件之一中。要么是宏,要么是有条件定义的,而实际上没有设置。

找出原因。

关于c++ - C++中未定义的引用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21690346/

10-11 15:29