Произошла ошибка компиляции gcc из исходного кода
Сейчас gcc и g++ на моем компьютере с Ubuntu 15.10 версии 5.2.1. Мне нужно установить v4.4 из них по некоторым причинам. Я скачал исходный код gcc4.4.7 и настроил это:
../configure \
--disable-checking \
--enable-languages=c,c++ \
--enable-multiarch \
--enable-shared \
--enable-threads=posix \
--program-suffix=4.4 \
--with-gmp=/usr/local/lib \
--with-mpc=/usr/local/lib \
--with-mpfr=/usr/local/lib \
--without-included-gettext \
--with-system-zlib \
--with-tune=generic \
--prefix=$HOME/bin/android_build
Я получил make-файл и попытался сделать, но я получаю эти две ошибки:
../../gcc/toplev.c:536:1: error: redefinition of ‘floor_log2’
../../gcc/toplev.c:571:1: error: redefinition of ‘exact_log2’
Так как решить эту проблему? Благодарю.
3 ответа
Я пытался установить gcc 4.4.7
тоже с новее gcc
версия. Я видел те же ошибки, что и вы. Согласно этому сообщению об ошибке, проблема связана с флагом -fno-gn89-inline
, который стал флагом по умолчанию для обработки встроенных функций на более новых gcc
версии. По состоянию на gcc 4.3
по умолчанию было -fgnu89-inline
, Так что все, что вам нужно сделать, это установить -fgnu89-inline
флаг при компиляции.
Я пробовал это с
CFLAGS='-fgnu89-inline -g -O2' CXXFLAGS='-fgnu89-inline -g -O2' ./configure
make
но я все еще получаю ту же ошибку. Я предполагаю, что флаги не передаются должным образом, но я не знаю. Тогда я попробовал нормальный
./configure
и изменил две строки в Makefile
от
CC = gcc
CXX = g++
в
CC = gcc -fgnu89-inline
CXX = g++ -fgnu89-inline
При этом я больше не видел ошибок.
Однако я столкнулся с другими ошибками:
@itemx must follow @item
Они вызваны более новой версией texinfo
так что вы могли бы использовать старую версию texinfo
, Может быть, вы могли бы также исправить их вручную, я попробовал это для одного случая, но я не знаю, что я делаю, поэтому я не пошел по этому пути.
Короче говоря, я думаю, вам лучше работать с виртуальной машиной или образом докера.
Пытаться../configure CFLAGS='-fgnu89-inline -g -O2' ...
У меня это сработало.
/* //toplev.h 注释下面两个函数 Annotate the following two functions
extern inline int
floor_log2 (unsigned HOST_WIDE_INT x)
{
return x ? HOST_BITS_PER_WIDE_INT - 1 - (int) CLZ_HWI (x) : -1;
}
extern inline int
exact_log2 (unsigned HOST_WIDE_INT x)
{
return x == (x & -x) && x ? (int) CTZ_HWI (x) : -1;
}
*/