【问题标题】:How to use an older version of gcc in Linux如何在 Linux 中使用旧版本的 gcc
【发布时间】:2011-04-11 12:54:17
【问题描述】:

在 Linux 中,我试图编译使用 -fwritable-strings 选项的东西。显然这是一个 gcc 选项,在较新版本的 gcc 中不起作用。我在我的系统上安装了 gcc-3.4,但我认为新版本仍在使用,因为我仍然收到错误消息,说它无法识别命令行选项 -fwritable-strings。如何让 make 使用旧版本的 gcc?

【问题讨论】:

    标签: linux gcc makefile


    【解决方案1】:

    您对正在使用的构建系统只字未提,但通常旧版本的 gcc 可以通过类似的方式显式调用(这是基于 autotools 的构建):

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

    对于基于 make 的构建系统,有时这会起作用:

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

    大多数 makefile 应该以这种方式识别覆盖 CCCXX

    【讨论】:

    • 我认为这不会起作用,因为配置文件只是几条语句,并没有做任何事情。
    • 那么它可能不是使用自动工具构建的。如果您向我们提供更多详细信息,我们可能会提供帮助。
    • 这家伙可能会在明年受到多次打击,因为最新升级到 Ubuntu 11.04 和 gcc-4.5.2 会破坏 gcc。我必须这样做才能编译 gst-ffmpeg。我不得不做类似的事情。 ./configure --prefix=/usr CC=gcc-4.4。为了帮助搜索找到这个链接。这是编译器错误:
    • 这可能会在明年受到重创。最新的 ubuntu 升级打破了 gcc-4.5.2 的一些优化,为了编译 gst-ffmpeg,我不得不使用 ./configure --prefix=/usr CC=gcc-4.4。对于搜索,这里是错误: internal compiler error: in set_jump_prob, at stmt.c:2319
    【解决方案2】:

    如果编辑配置/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 的东西 afaik,而不是一般的 linux 实用程序。一些发行版使用其他方式以类似的方式选择工具版本,但这取决于您使用的发行版。
    【解决方案3】:

    也许您可以在编译程序时提供 gcc-3.4 安装的整个路径: /path_to_gcc_3.4/gcc your_program

    【讨论】:

    • 这不是我的程序。我正在使用 make。
    • 尝试将此行添加到 Makefile:CC=/path_to_gcc_3.4/gcc
    【解决方案4】:

    如果您可以找到实际使用可写字符串的位置,另一种可能性是在代码实际编辑的文字字符串子集上使用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”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-16
      相关资源
      最近更新 更多