5

我正在使用命令行编译一个 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_baseEde-mangles 为 vtable for (anonymous namespace)::handle_base (handle_base是在 prog.cc 的匿名命名空间中定义的多态类,是的,我确实调用了dynamic_cast<handle_base>()。)

我正在使用 gcc 版本 4.7.0 (GCC) 和 GNU ld (GNU Binutils; openSUSE 11.1) 2.19。任何人都可以提供帮助(建议解决方案[除了没有共享对象或dynamic cast])吗?

4

2 回答 2

1

I just ran into something similar when upgrading to ubuntu 14.04. I had to add -fkeep-inline-functions to the source file that defined the 'missing' symbol. No idea if your problem is similar.

于 2014-06-09T01:22:16.527 回答
0

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

#define VISIBILITY __attribute__((visibility("hidden")))
class VISIBILITY handle_base; 
于 2014-08-28T06:02:42.297 回答