2013-02-08 15 views
5

Sto compilando un programma C++ utilizzando la riga di comandoerrore del linker "delocalizzazione R_X86_64_PC32 contro il simbolo non definito" nonostante la compilazione con -fPIC

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

e quindi provare a fare un oggetto condiviso tramite

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

Questo ha sempre funzionato. Ma oggi ottengo:

/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 

Il simbolo _ZTVN12_GLOBAL__N_111handle_baseE de-Mangani a vtable for (anonymous namespace)::handle_base (handle_base è una classe polimorfica definita nel namespace anonimo prog.cc e sì mi chiamo dynamic_cast<handle_base>().)

I sto usando gcc versione 4.7.0 (GCC) e GNU ld (GNU Binutils; openSUSE 11.1) 2.19. Qualcuno può aiutare (suggerire soluzioni [a parte fare senza l'oggetto condiviso o lo dynamic cast])?

+0

Sembra che tu abbia dimenticato di * definire * qualche * metodo virtuale * per 'handle_base'. –

+0

Non devi ** link ** con -fPIC? –

+0

@ H2CO3 No. (Ho provato comunque: non fa differenza) – Walter

risposta

1

Mi sono imbattuto in qualcosa di simile durante l'aggiornamento a Ubuntu 14.04. Ho dovuto aggiungere -fkeep-inline-functions al file sorgente che ha definito il simbolo 'mancante'. Non ho idea se il tuo problema è simile.

0

Hai solo bisogno di rendere la visibilità predefinita nascosta per la tua classe base (handle_base). Puoi farlo da -

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

(1) Penso che '__attribute __ ((visibility (" hidden ")))' sia non standard e non supportato in questo modulo da tutti i compilatori. (2) perché questo risolverebbe il problema? – Walter

+0

1. Non vedo da nessuna parte che lo ritenga non standard. Ma dirò che dice: "È meglio non usare l'opzione di visibilità per i programmi orientati agli oggetti C++ a causa del pericolo di generare errori di runtime che sono difficili da debugare, ma sfruttare le caratteristiche intrinseche dell'oggetto C++- programmi orientati, come incapsulamento, spazi dei nomi, ereditarietà e altre caratteristiche. " 2. Come dice https://gcc.gnu.org/wiki/Visibility, il n. 4 potrebbe essere il tuo caso. –

+1

@Robelsharma Tutti gli "__attribute__'s sono estensioni GCC. [Documentazione GCC] (https://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html) afferma chiaramente che questi attributi sono "Estensioni C". –

Problemi correlati