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_baseEprog.cc の無名名前空間で定義されたポリモーフィック クラスであり、はい、私は を呼び出します。)vtable for (anonymous namespace)::handle_basehandle_basedynamic_cast<handle_base>()

私は gcc バージョン 4.7.0 (GCC) と GNU ld (GNU Binutils; openSUSE 11.1) 2.19 を使用しています。誰か助けてくれますか ([共有オブジェクトやdynamic cast] なしで行う以外の解決策を提案してください)?

4

2 に答える 2

0

基本クラス (handle_base) のデフォルトの可視性を非表示にする必要があるだけです。あなたはこれを行うことができます -

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