ошибка компоновщика «перемещение R_X86_64_PC32 в отношении неопределенного символа» несмотря на компиляцию с -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 освобождает от
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])?

5

Решение

Я просто столкнулся с чем-то похожим при обновлении до Ubuntu 14.04. Мне пришлось добавить -fkeep-inline-functions в исходный файл, который определил символ «отсутствует». Не знаю, если ваша проблема похожа.

1

Другие решения

Вам просто нужно сделать видимость по умолчанию скрытой для вашего базового класса (handle_base). Вы можете сделать это путем —

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

По вопросам рекламы [email protected]