在Linux中我试图编译使用-fwritable-strings选项的东西。显然这是一个gcc选项,在较新版本的gcc中不起作用。我在我的系统上安装了gcc-3.4,但我认为新版本仍然被使用,因为我仍然得到错误,说它无法识别命令行选项-fwritable-strings。如何才能使用旧版本的gcc?
答案 0 :(得分:7)
您对正在使用的构建系统一无所知,但通常可以通过类似的方式显式调用旧版本的gcc(这适用于基于autotools的构建):
./configure CXX=g++-3.4 CC=gcc-3.4
对于基于make的构建系统,有时这会起作用:
make CXX=g++-3.4 CC=gcc-3.4
大多数makefile应该以这种方式识别覆盖CC
和CXX
。
答案 1 :(得分:0)
如果您可以找到实际使用可写字符串的位置,则另一种可能性是在代码实际编辑的文字字符串子集上使用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”。
答案 2 :(得分:0)
也许你可以在编译程序时给出gcc-3.4安装的完整路径: /path_to_gcc_3.4/gcc your_program
答案 3 :(得分:0)
如果不能编辑配置/ 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
: