2010-09-13 16 views
7

W Linuksie próbuję skompilować coś, co używa opcji -fwritable-string. Podobno jest to opcja gcc, która nie działa w nowszej wersji gcc. Zainstalowałem gcc-3.4 w moim systemie, ale myślę, że ta nowsza wersja jest nadal używana, ponieważ wciąż dostaję błąd, który mówi, że nie rozpoznaje opcji wiersza poleceń -fwritable-stringi. Jak mogę uzyskać dostęp do starszej wersji gcc?Jak używać starszej wersji gcc w Linuksie

Odpowiedz

0

Jeśli możesz znaleźć miejsce, w którym faktycznie są używane łańcuchy zapisu, inną możliwością byłoby użycie strdup i free w podzbiorze literałów, które kod faktycznie edytuje. Może to być bardziej skomplikowane niż obniżanie wersji GCC, ale sprawi, że kod będzie dużo bardziej przenośny.

Edit
W odpowiedzi na wyjaśnienie pytanie/komentarz poniżej, jeśli widziałeś coś takiego:

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

Można by zastąpić wyżej z czymś takim:

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

i gdzie poprzednio:

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

Można by wymienić powyżej:

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

Zakładając, że dokonał tych poprawek „-fwritable-strings” nie będzie już konieczne.

+0

Jak to działa? Czy możesz dać przykład? –

0

Może po prostu dać całą ścieżkę gcc-3.4 zainstalować podczas kompilacji programu: /path_to_gcc_3.4/gcc your_program

+0

To nie jest mój program. Używam make. –

+0

Spróbuj dodać tę linię do pliku Makefile: CC =/path_to_gcc_3.4/gcc –

7

powiedzieć nic o systemie budować w użyciu, ale zazwyczaj stare wersje gcc można powoływać się wprost, przez coś podobnego (to jest na budowie autotools-based):

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

dla systemu opartego na produkcji Producent, czasem to będzie działać:

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

Większość plików Makefile powinna rozpoznawać przesłanianie CC i CXX w ten sposób.

+0

Nie sądzę, że to zadziała, ponieważ plik konfiguracyjny to tylko kilka instrukcji i nic nie robi. –

+1

Cóż, prawdopodobnie nie jest zbudowany z autotools. Jeśli dasz nam więcej szczegółów, będziemy w stanie Ci pomóc. –

+0

Ten facet prawdopodobnie zostanie trafiony kilka razy w przyszłym roku jako najnowsze uaktualnienie do wersji Ubuntu 11.04 i gcc-4.5.2 z gcc. Musiałem to zrobić, aby skompilować gst-ffmpeg. Musiałem coś zrobić. ./configure --prefix =/usr CC = gcc-4.4. Aby ułatwić wyszukiwanie, znajdź ten link. tutaj jest błąd kompilatora: –

0

Jeśli edycja pliku konfiguracyjnego/Makefile nie jest możliwa, system Linux zawiera narzędzie o nazwie update-alternatives w takich sytuacjach. Jednak korzystanie z niego jest bardzo trudne (linki do różnych samouczków zamieszczonych poniżej).

To jest trochę prostsza - oto skrypt (z here), aby łatwo przełączać domyślnego gcc/g++ wersja:

#!/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 

Jeśli 1) Nazwa skrypt switch-gcc, 2) umieścić go na swojej drodze oraz 3) sprawiają, że plik wykonywalny (chmod +x switch-gcc) można następnie przełączać wersje kompilatora prostu uruchamiając

sudo switch-gcc 3.2

Dalsze ponownego ading na update-alternatives:

Powiązane problemy