链接器错误“重定位R_X86_64_PC32对未定义的符号”尽管使用-fPIC进行编译

时间:2013-02-08 18:44:22

标签: c++ gcc linker-errors ld fpic

我正在使用命令行

编译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 de-mangles to 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])?

2 个答案:

答案 0 :(得分:1)

升级到ubuntu 14.04时,我遇到了类似的问题。我不得不在定义“缺失”符号的源文件中添加-fkeep-inline-functions。不知道你的问题是否相似。

答案 1 :(得分:0)

您只需要为基类隐藏默认可见性(handle_base)。你可以通过 -

来做到这一点
#define VISIBILITY __attribute__((visibility("hidden")))
class VISIBILITY handle_base;