La Compilation échoue avec “délocalisation R_X86_64_32 contre".rodata.str1.8' ne peut pas être utilisée lors de la prise d'un objet partagé”
Je suis en train de compiler ce code source à partir du makefile dans un VPS, mais sa ne fonctionne pas. Le VPS est un 64 Cent OS
Voici le message d'erreur
# make
gcc -c -O3 -w -DLINUX -I../SDK/amx/ ../SDK/amx/*.c
g++ -c -O3 -w -DLINUX -I../SDK/amx/../SDK/*.cpp
g++ -c -O3 -w -DLINUX -I../SDK/amx/*.cpp
g++ -O2 -fshort-wchar -shared -o "TCP_V1.so" *.o
/usr/bin/ld: TCP-LINUX_V1.o: relocation R_X86_64_32 against `.rodata.str1.8' can not be used when making a shared object; recompile with -fPIC
TCP-LINUX_V1.o: could not read symbols: Bad value
collect2: ld returned 1 exit status
make: *** [all] Error 1
Voici mon makefile:
GPP=g++
GCC=gcc
OUTFILE="TCP_V1.so"
COMPILE_FLAGS=-c -O3 -w -DLINUX -I../SDK/amx/
all:
$(GCC) $(COMPILE_FLAGS) ../SDK/amx/*.c
$(GPP) $(COMPILE_FLAGS) ../SDK/*.cpp
$(GPP) $(COMPILE_FLAGS) *.cpp
$(GPP) -O2 -fshort-wchar -shared -o $(OUTFILE) *.o
Ce que quelqu'un sait quel est le problème?
- Avez-vous essayé
recompile with -fPIC
? - Désolé, mais je ne suis pas sûr de la façon de le faire. Ne pouvez pas trouver quelque chose à propos de "-fPIC" sur google.
- Essayez quelque chose comme
COMPILE_FLAGS=-c -O3 -w -DLINUX -fPIC -I../SDK/amx/
- Connexes: stackoverflow.com/questions/6093547/...
- si vous effectuez une recherche google pour le fPIC, vous trouverez certainement rien. Retirez le moins ou utilisez des guillemets "-fPIC", sinon vous omettez tous les résultats contenant le fPIC.
- Double Possible de Ce n'R_X86_64_32S et R_X86_64_64 réinstallation veux dire?
Vous devez vous connecter pour publier un commentaire.
Faire ce que le compilateur vous dit de faire, c'est à dire de recompiler avec
-fPIC
. Pour en savoir qu'est-ce drapeau de faire et pourquoi vous en avez besoin dans ce cas, voir Options De Génération De Code du manuel de GCC.En bref, le terme code indépendant de la position (PIC) renvoie le code machine généré qui est l'adresse de mémoire agnostique, c'est à dire ne pas faire d'hypothèses sur l'endroit où il a été chargé dans la RAM. Seulement code indépendant de la position est censé pour être inclus dans les objets partagés (DONC) qu'ils devraient avoir la capacité de changer dynamiquement leur emplacement dans la mémoire RAM.
Enfin, vous pouvez lire à ce sujet sur Wikipédia trop.
-fPIC
à tous le compilateur invocations pour tous les fichiers source (unités de traduction, par exemple*.cpp
fichiers) de la bibliothèque. Le concret de la façon de le faire dépend de la construction du système que vous utilisez. Par exemple, dans CMake vous pouvezset_target_properties(${LIBRARY_NAME} PROPERTIES POSITION_INDEPENDENT_CODE ON)
. Dans le cas de ce type (à l'aide de la plaine de vieux Faire), il aurait dû faireCOMPILE_FLAGS+=-fPIC
depuis qu'il est à l'aide de cette variable pour désigner l'ensemble des options de compilation pour tous les fichiers source de sa bibliothèque.Dans mon cas, cette erreur s'est produite en raison d'un
make
commande m'attendais à aller chercher les bibliothèques partagées (*.so
fichiers) à partir d'un répertoire distant indiqué par unLDFLAGS
variable d'environnement. Dans une erreur, seuls les bibliothèques statiques étaient disponibles (*.la
ou*.a
fichiers).Donc, mon problème ne réside pas avec le programme, j'était en train de rassembler mais avec la distance bibliothèques qu'il était en train de chercher.
Donc, je n'ai pas besoin d'ajouter un drapeau (dire,
-fPIC
) à la compilation interrompue par la relocalisation d'erreur.Plutôt, j'ai recompilé la distance de la bibliothèque, de sorte que les objets partagés étaient disponibles.
En gros, c'est un fichier n'est pas trouvé d'erreur dans le déguisement.
Dans mon cas, j'ai dû supprimer un égaré
--disable-shared
commutateur dans leconfigure
invocation pour la condition de programme, depuis partagés et les bibliothèques statiques ont été construits en tant que par défaut.J'ai remarqué que la plupart des programmes de construire deux types de bibliothèques dans le même temps, de sorte que le mien est probablement un cas de coin. En général, il peut être le cas que vous avez plutôt à permettre aux bibliothèques partagées, en fonction des paramètres par défaut.
Pour inspecter votre situation particulière avec la compilation des commutateurs et des paramètres par défaut, je voudrais lire le résumé qui s'affiche avec
./configure --help | less
, généralement dans la section Fonctionnalités Optionnelles. J'ai souvent constaté que cette lecture est plus fiable que les guides d'installation qui ne sont pas mis à jour alors que la dépendance des programmes d'évoluer.Il n'est pas toujours sur les options de compilation, j'ai la même erreur sur gentoo lors de l'utilisation de distcc.
La raison en est que sur distcc serveur à l'aide d'un non-durci profil et sur le client le profil est durci. Cochez cette discussion:
https://forums.gentoo.org/viewtopic-p-7463994.html
Un "nettoyage" résolu pour moi.
Mon projet est une application C++ (pas de bibliothèque partagée). Je aléatoirement eu cette erreur après beaucoup de succès construit.
J'ai eu le même problème. Essayez de recompiler l'aide de
-fPIC
drapeau.