如何在Linux中使用较旧版本的gcc

14

我正在Linux系统下尝试编译一个使用-fwritable-strings选项的程序。显然这是一个gcc选项,但在新版本的gcc中该选项无效。我已经在系统上安装了gcc-3.4,但我认为仍在使用更新的版本,因为我仍然收到错误提示说无法识别命令行选项-fwritable-strings。如何让make使用较旧的gcc版本?

4个回答

10

您没有提及所使用的构建系统,但通常可以通过类似以下命令来显式地调用旧版本的gcc(这是基于autotools的构建):

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

对于一个基于make的构建系统,有时候这样做是可行的:

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

大多数Makefile应该能够以这种方式识别覆盖CCCXX


我认为那样做不会起作用,因为配置文件只是几个语句,并没有实际操作。 - node ninja
1
那么它可能没有使用自动化工具构建。如果您提供更多细节,我们或许可以提供帮助。 - Jack Kelly
这个人可能在接下来的一年中会被多次打击,因为Ubuntu 11.04和gcc-4.5.2的最新升级破坏了gcc。我不得不这样做才能让gst-ffmpeg编译通过。我必须像这样做:./configure --prefix=/usr CC=gcc-4.4。为了帮助搜索找到这个链接,这里是编译器错误: - Jonathan Henson
这可能会在接下来的一年里受到很大影响。最新的Ubuntu升级破坏了一些与gcc-4.5.2的优化,为了让gst-ffmpeg编译成功,我不得不使用./configure --prefix=/usr CC=gcc-4.4。搜索时出现以下错误:内部编译器错误:在stmt.c:2319中set_jump_prob。 - Jonathan Henson

1
如果无法编辑配置/Makefile,Linux中包含一个名为update-alternatives的实用程序来处理此类情况。 但是,使用它很麻烦(下面链接到各种教程)。
这里有一个脚本(来自here),可以轻松切换默认的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的阅读资料:

据我所知,update-alternatives 是 Debian/Ubuntu 特有的东西,不是通用的 Linux 实用程序。一些发行版使用其他类似的方式来选择工具的版本,但这取决于您使用的发行版。 - Epcylon

0
也许在编译程序时,你可以直接提供gcc-3.4的完整路径: /path_to_gcc_3.4/gcc your_program

这不是我的程序。我正在使用make。 - node ninja
尝试将以下行添加到Makefile中:CC=/path_to_gcc_3.4/gcc - Thomas Padron-McCarthy

0
如果您能找到可写字符串实际被使用的位置,另一个可能性是在代码实际编辑的文字子集上使用strdupfree。这可能比降级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"将不再必要。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接