2013-02-08 19 views
5

Ich Kompiliere ein C++ Programm über die BefehlszeileLinkerfehler „Relocation R_X86_64_PC32 gegen undefiniertes Symbol“ trotz Compilation mit -fPIC

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

und dann versuchen, ein gemeinsames Objekt über

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

Das hat immer funktioniert. Aber heute habe ich bekommen:

/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 

Das Symbol _ZTVN12_GLOBAL__N_111handle_baseE de-Mangeln zu vtable for (anonymous namespace)::handle_base (handle_base eine polymorphe Klasse ist in dem anonymen Namespace in prog.cc definiert und ja, ich dynamic_cast<handle_base>() nennen.)

I verwende gcc Version 4.7.0 (GCC) und GNU ld (GNU Binutils; openSUSE 11.1) 2.19. Kann jemand helfen (schlagen Sie Lösungen vor [anders als ohne gemeinsames Objekt oder die dynamic cast])?

+0

Sieht aus, als hätten Sie vergessen, * einige * virtuelle Methode * für 'handle_base' zu ​​definieren. –

+0

Müssen Sie nicht ** auch mit -fPIC ** verlinken? –

+0

@ H2CO3 Nein. (Ich habe es trotzdem versucht: macht keinen Unterschied) – Walter

Antwort

1

Ich habe gerade etwas ähnliches beim Upgrade auf Ubuntu 14.04. Ich musste -fkeep-inline-Funktionen zur Quelldatei hinzufügen, die das fehlende Symbol definiert hat. Keine Ahnung, ob dein Problem ähnlich ist.

0

Sie müssen nur die Standardsichtbarkeit für Ihre Basisklasse ausgeblendet (handle_base). Sie können dies tun durch -

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

(1) Ich denke, das 'Attribut __ ((Sichtbarkeit (versteckt)))) ist nicht standard und wird nicht in dieser Form von allen Compilern unterstützt. (2) Warum würde dies das Problem lösen? – Walter

+0

1. Ich sehe nirgendwo, dass es nicht Standard sagt. Aber ich sage, es heißt - "Es ist am besten, die Sichtbarkeitsoption für objektorientierte C++ - Programme nicht zu verwenden, da die Gefahr besteht, dass Laufzeitfehler erzeugt werden, die schwer zu debuggen sind. Stattdessen sollten Sie die inhärenten Eigenschaften von C++ - Objekten nutzen. orientierte Programme wie Kapselung, Namespaces, Vererbung und andere Eigenschaften. " 2. Wie https://gcc.gnu.org/wiki/Visibility sagt, die Nr. 4 könnte dein Fall sein. –

+1

@Robelsharma Alle '__attribute__'s sind GCC-Erweiterungen. [GCC-Dokumentation] (https://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html) besagt eindeutig, dass diese Attribute "C-Erweiterungen" sind. –