连接错误“对未定义的符号搬迁R_X86_64_PC32”尽管有-fPIC编译(linker erro

2019-07-19 15:03发布

我编译使用命令行C ++程序

g++ -c prog.cc -std=c++11 -march=native -fPIC -fopenmp

然后尝试通过做一个共享对象

g++ prog.o -shared -fopenmp -o lib/libprog.so

这一直工作。 但是,今天我得到:

/usr/bin/ld: prog.o: relocation R_X86_64_PC32 against undefined symbol 
  `_ZTVN12_GLOBAL__N_111handle_baseE' can not be used when making a shared
  object; recompile with -fPIC
/usr/bin/ld: final link failed: Bad value
collect2: error: ld returned 1 exit status

符号_ZTVN12_GLOBAL__N_111handle_baseE去轧液,以vtable for (anonymous namespace)::handle_basehandle_base是在prog.cc匿名命名空间中定义一个多态类是的,我做电dynamic_cast<handle_base>()

我使用的gcc版本4.7.0(GCC)和GNU LD(GNU Binutils的,openSUSE的11.1)2.19。 任何人可以帮助(提出解决方案[比没有共享对象或做其他dynamic cast ])?

Answer 1:

升级到Ubuntu 14.04的时候我只是碰到了类似的东西。 我不得不-fkeep内联函数添加到定义的“失踪”符号的源文件。 不知道,如果你的问题是相似的。



Answer 2:

你只需要进行隐藏你的基类(handle_base)的默认可见性。 你可以做到这一点 -

#define VISIBILITY __attribute__((visibility("hidden")))
class VISIBILITY handle_base; 


文章来源: linker error “relocation R_X86_64_PC32 against undefined symbol” despite compilation with -fPIC