【发布时间】:2011-04-11 12:54:17
【问题描述】:
在 Linux 中,我试图编译使用 -fwritable-strings 选项的东西。显然这是一个 gcc 选项,在较新版本的 gcc 中不起作用。我在我的系统上安装了 gcc-3.4,但我认为新版本仍在使用,因为我仍然收到错误消息,说它无法识别命令行选项 -fwritable-strings。如何让 make 使用旧版本的 gcc?
【问题讨论】:
在 Linux 中,我试图编译使用 -fwritable-strings 选项的东西。显然这是一个 gcc 选项,在较新版本的 gcc 中不起作用。我在我的系统上安装了 gcc-3.4,但我认为新版本仍在使用,因为我仍然收到错误消息,说它无法识别命令行选项 -fwritable-strings。如何让 make 使用旧版本的 gcc?
【问题讨论】:
您对正在使用的构建系统只字未提,但通常旧版本的 gcc 可以通过类似的方式显式调用(这是基于 autotools 的构建):
./configure CXX=g++-3.4 CC=gcc-3.4
对于基于 make 的构建系统,有时这会起作用:
make CXX=g++-3.4 CC=gcc-3.4
大多数 makefile 应该以这种方式识别覆盖 CC 和 CXX。
【讨论】:
如果编辑配置/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 实用程序。一些发行版使用其他方式以类似的方式选择工具版本,但这取决于您使用的发行版。
也许您可以在编译程序时提供 gcc-3.4 安装的整个路径: /path_to_gcc_3.4/gcc your_program
【讨论】:
如果您可以找到实际使用可写字符串的位置,另一种可能性是在代码实际编辑的文字字符串子集上使用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”。
【讨论】: