linker error “réinstallation R_X86_64_PC32 contre undefined symbol” en dépit de la compilation avec -fPIC
Je suis à la compilation d'un programme c++ en utilisant la ligne de commande
g++ -c prog.cc -std=c++11 -march=native -fPIC -fopenmp
et puis essayer de faire un objet partagé via
g++ prog.o -shared -fopenmp -o lib/libprog.so
Ce qui a toujours travaillé. Mais aujourd'hui, je reçois:
/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
Le symbole _ZTVN12_GLOBAL__N_111handle_baseE
de-mangles à
vtable for (anonymous namespace)::handle_base
(handle_base
est un polymorphe classe définie dans l'espace de noms anonymes en prog.cc et oui, je fais appel dynamic_cast<handle_base>()
.)
Je suis en utilisant gcc version 4.7.0 (GCC) et GNU ld (GNU Binutils; openSUSE 11.1) 2.19. Quelqu'un peut-il aider (proposer des solutions autres que de le faire sans objet partagé ou le dynamic cast
])?
On dirait que vous avez oublié de définir méthode virtuelle pour
Vous n'avez pas de lien avec -fPIC?
Pas de. (J'ai essayé de toute façon: fait aucune différence).
Si la méthode est virtuelle pure, alors vous n'avez pas défini.
N' "g++ -partagé prog.cc -std=c++11 -march=native -fPIC-fopenmp -o lib/libprog.donc," ont le même problème?
handle_base
.Vous n'avez pas de lien avec -fPIC?
Pas de. (J'ai essayé de toute façon: fait aucune différence).
Si la méthode est virtuelle pure, alors vous n'avez pas défini.
handle_base
seulement comme une méthode virtuelle pure. Faire que seulement virtuelle, et de donner un corps de la fonction ne doit pas aider.N' "g++ -partagé prog.cc -std=c++11 -march=native -fPIC-fopenmp -o lib/libprog.donc," ont le même problème?
OriginalL'auteur Walter | 2013-02-08
Vous devez vous connecter pour publier un commentaire.
Je viens de tomber sur quelque chose de similaire lors de la mise à niveau vers ubuntu 14.04. J'ai dû ajouter -fkeep-inline-fonctions pour le fichier source, qui a défini les "disparus" du symbole. Aucune idée si votre problème est similaire.
OriginalL'auteur Dan Kegel
Vous avez juste besoin de faire de la visibilité par défaut caché pour votre classe de base(handle_base). Vous pouvez le faire par
__attribute__((visibility("hidden")))
est non standard et non pris en charge dans cette forme par tous les compilateurs. (2) pourquoi en serait-il résoudre le problème?1. Je ne vois nulle part qu'il est dit non-standard. Mais je dirai qu'il dit -- "Il est préférable de ne pas utiliser l'option de visibilité pour le C++ orienté objet en raison du risque de générer des erreurs d'exécution qui sont difficiles à déboguer. Au lieu de cela, prendre le parti des caractéristiques inhérentes de C++ orienté objet, telles que l'encapsulation, les espaces de noms, à l'héritage et d'autres caractéristiques." 2. gcc.gnu.org/wiki/Visibility dit , la pas de. 4 peut-être votre cas.
Tous les
__attribute__
s sont des extensions de GCC. GCC documentation indique clairement que ces attributs sont des "C Extensions."OriginalL'auteur Robel Sharma