c++ make La compilation échoue avec "relocation R_X86_64_32 contre`.rodata.str1.8 'ne peut pas être utilisé lors de la création d'un objet partagé "




shared library linux (4)

Il ne s'agit pas toujours des drapeaux de compilation, j'ai la même erreur sur gentoo lors de l'utilisation de distcc.

La raison en est que sur le serveur distcc utilise un profil non durci et sur le client le profil est durci. Cochez cette discussion: https://forums.gentoo.org/viewtopic-p-7463994.html

J'essaye de compiler ce code source à partir du makefile dans un VPS, mais cela ne fonctionne pas. Le VPS est un OS 64 Cent

Voici l'erreur complète

# 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

Quelqu'un sait ce qui ne va pas?


J'ai eu le même problème. Essayez de recompiler en utilisant l' -fPIC .


Faites ce que le compilateur vous dit de faire, c'est-à-dire recompiler avec -fPIC . Pour savoir ce que fait ce drapeau et pourquoi vous en avez besoin dans ce cas, voir Options de génération de code du manuel GCC.

En bref, le terme code indépendant de la position (PIC) fait référence au code machine généré qui est indépendant de l' adresse mémoire, c'est-à-dire qui ne fait aucune hypothèse quant à l'endroit où il a été chargé dans la RAM. Seul le code indépendant de la position est supposé être inclus dans les objets partagés (SO) car ils devraient avoir la possibilité de changer dynamiquement leur emplacement dans la RAM.

Enfin, vous pouvez en savoir plus sur Wikipedia .


Dans mon cas, cette erreur est survenue car une commande make s'attendait à récupérer des bibliothèques partagées (fichiers *.so ) à partir d'un répertoire distant indiqué par une variable d'environnement LDFLAGS . En cas d'erreur, seules les bibliothèques statiques y étaient disponibles (fichiers *.la ou *.a ).

Par conséquent, mon problème ne résidait pas dans le programme que je compilais mais avec les bibliothèques distantes qu'il essayait d'extraire. Donc, je n'avais pas besoin d'ajouter de drapeau (disons, -fPIC ) à la compilation interrompue par l'erreur de relocalisation. J'ai plutôt recompilé la bibliothèque distante afin que les objets partagés soient disponibles.

Fondamentalement, il a été une erreur de fichier-not-found dans le déguisement.

Dans mon cas, j'ai dû supprimer un commutateur --disable-shared mal --disable-shared dans l'appel de configure pour le programme requis, puisque les bibliothèques partagées et statiques ont été construites par défaut.

J'ai remarqué que la plupart des programmes construisent les deux types de bibliothèques en même temps, donc le mien est probablement un cas d'angle. En général, il se peut que vous deviez plutôt activer les bibliothèques partagées, en fonction des valeurs par défaut.

Pour inspecter votre situation particulière avec les commutateurs de compilation et les valeurs par défaut, je voudrais lire le résumé qui apparaît avec ./configure --help | less ./configure --help | less , généralement dans la section Caractéristiques optionnelles. J'ai souvent trouvé que cette lecture est plus fiable que les guides d'installation qui ne sont pas mis à jour pendant que les programmes de dépendance évoluent.





shared-libraries