2010-09-13 6 views
7

Sous Linux, j'essaie de compiler quelque chose qui utilise l'option -fwritable-strings. Apparemment, il s'agit d'une option gcc qui ne fonctionne pas dans une version plus récente de gcc. J'ai installé gcc-3.4 sur mon système, mais je pense que la version la plus récente est toujours utilisée parce que je reçois toujours l'erreur qui indique qu'elle ne peut pas reconnaître l'option de ligne de commande -fwritable-strings. Comment puis-je obtenir make pour utiliser l'ancienne version de gcc?Comment utiliser une ancienne version de gcc sous Linux

Répondre

0

Si vous pouvez trouver où les chaînes inscriptibles sont réellement utilisées, une autre possibilité serait d'utiliser strdup et free sur le sous-ensemble de chaînes littérales que le code édite réellement. Cela peut être plus compliqué que la rétrogradation des versions de GCC, mais rendra le code beaucoup plus portable.

Modifier
En réponse à la question de clarification/commentaire ci-dessous, si vous avez vu quelque chose comme:

char* str = "XXX"; 
str[1] = 'Y'; 
str[2] = 'Z'; 
// ... use of str ... 

Vous remplacerez ci-dessus avec quelque chose comme:

char* str = strdup("XXX"); 
str[1] = 'Y'; 
str[2] = 'Z'; 
// ... use of str ... 
free(str); 

Où vous aviez précédemment:

char* str = "Some string that isn't modified"; 

Vous remplaceraient ci-dessus avec:

const char* str = "Some string that isn't modified"; 

En supposant que vous avez fait ces corrections, « l'option -fwritable-chaînes » ne seraient plus nécessaires.

+0

Comment ça marche? Pouvez-vous donner un exemple? –

0

Peut-être que vous pourriez juste donner le chemin complet du gcc-3.4 installer lors de la compilation de votre programme: /path_to_gcc_3.4/gcc your_program

+0

Ce n'est pas mon programme. J'utilise make. –

+0

Essayez d'ajouter cette ligne au Makefile: CC =/path_to_gcc_3.4/gcc –

7

Vous ne dites rien sur le système de construction en cours d'utilisation, mais les versions habituellement vieux de gcc peut être invoquée explicitement, par quelque chose comme (ce qui est une construction basé sur les autotools):

./configure CXX=g++-3.4 CC=gcc-3.4 

pour un système de construction basé maquillage, parfois cela fonctionnera:

make CXX=g++-3.4 CC=gcc-3.4 

La plupart des fichiers makefiles doivent reconnaître CC et CXX de cette manière.

+0

Je ne pense pas que cela fonctionnera car le fichier configure est juste quelques instructions et ne fait rien. –

+1

Eh bien, il n'est probablement pas construit avec les autotools. Si vous nous avez donné plus de détails, nous pourrions peut-être vous aider. –

+0

Ce type sera probablement touché à plusieurs reprises l'année prochaine car la dernière mise à niveau vers Ubuntu 11.04 et gcc-4.5.2 casse gcc. Je devais faire ceci pour obtenir la compilation de gst-ffmpeg. Je devais faire quelque chose comme. ./configure --prefix =/usr CC = gcc-4.4. Pour aider les recherches à trouver ce lien. Voici l'erreur du compilateur: –

0

Si l'édition de la configuration/Makefile n'est pas une option, Linux inclut un utilitaire appelé update-alternatives pour de telles situations. Cependant, c'est une douleur à utiliser (liens vers divers tutoriels inclus ci-dessous).

Ceci est un peu plus simple - voici un script (de here) pour changer facilement votre défaut gcc/g++ Version:

#!/bin/bash 
usage() { 
     echo 
     echo Sets the default version of gcc, g++, etc 
     echo Usage: 
     echo 
     echo " gcc-set-default-version <VERSION>" 
     echo 
     exit 
} 
cd /usr/bin 
if [ -z $1 ] ; then 
     usage; 
fi 
set_default() { 
     if [ -e "$1-$2" ] ; then 
       echo $1-$2 is now the default 
       ln -sf $1-$2 $1 
     else 
       echo $1-$2 is not installed 
     fi 
} 
for i in gcc cpp g++ gcov gccbug ; do 
     set_default $i $1 
done 

Si vous 1) le nom de ce script switch-gcc, 2) mettre dans votre chemin et 3) le rendre exécutable (chmod +x switch-gcc), vous pouvez passer d'une version du compilateur juste en exécutant

sudo switch-gcc 3.2

plus re ading sur update-alternatives:

Questions connexes