Как использовать более старую версию gcc в Linux - PullRequest
9 голосов
/ 13 сентября 2010

В Linux я пытаюсь скомпилировать что-то, использующее опцию -fwritable-strings. По-видимому, это опция gcc, которая не работает в более новой версии gcc. Я установил gcc-3.4 в своей системе, но я думаю, что более новая версия все еще используется, потому что я все еще получаю ошибку, которая говорит, что он не может распознать параметр командной строки -fwritable-strings. Как я могу заставить make использовать более старую версию gcc?

Ответы [ 4 ]

7 голосов
/ 13 сентября 2010

Вы ничего не говорите об используемой системе сборки, но обычно старые версии gcc могут вызываться явно, например, (это для сборки на основе autotools):

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

Для makeна основе системы сборки, иногда это будет работать:

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

Большинство make-файлов должны распознавать переопределение CC и CXX таким образом.

0 голосов
/ 24 октября 2017

Если редактирование конфигурации / Makefile не является опцией, Linux включает в себя утилиту под названием update-alternatives для таких ситуаций. Однако использовать его неудобно (ссылки на различные учебные пособия включены ниже).

Это немного проще - вот скрипт (из здесь ), чтобы легко переключать вашу версию по умолчанию gcc / g++:

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

Если вы 1) назовете этот скрипт switch-gcc, 2) поместите его в свой путь и 3) сделаете его исполняемым (chmod +x switch-gcc), вы можете переключать версии компилятора, просто запустив

sudo switch-gcc 3.2

Дополнительная информация по update-alternatives:

0 голосов
/ 13 сентября 2010

Может быть, вы могли бы просто указать полный путь установки gcc-3.4 при компиляции вашей программы: /path_to_gcc_3.4/gcc your_program

0 голосов
/ 13 сентября 2010

Если вы можете найти, где на самом деле используются записываемые строки, другой возможностью будет использование strdup и free в подмножестве буквенных строк, которые код на самом деле редактирует.Это может быть сложнее, чем версия GCC с более ранней версией, но сделает код намного более переносимым.

Редактировать В ответ на уточняющий вопрос / комментарий ниже, если вы увидели что-то вроде:

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

Вы бы заменили вышеприведенное на что-то вроде:

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

И где у вас ранее было:

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

Вы бы заменили вышеприведенное на:

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

Если вы сделали эти исправления, "-fwritable-strings" больше не понадобятся.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...