我目前正在尝试使用 AUR 安装 gcc41,但遇到了问题。
每次执行编译过程时,构建都会失败,因为存在重新定义错误,无法完成 toplev 对象的编译。
这是错误。我真的不知道从这里该去哪里。
In file included from ../../gcc/toplev.c:31:0:
../../gcc/gcov-io.h: In function ‘gcov_position’:
../../gcc/system.h:575:55: warning: ISO C does not support ‘__FUNCTION__’ predefined identifier [-Wpedantic]
((void)(!(EXPR) ? fancy_abort (__FILE__, __LINE__, __FUNCTION__), 0 : 0))
^
../../gcc/gcov-io.h:572:3: note: in expansion of macro ‘gcc_assert’
gcc_assert (gcov_var.mode > 0);
^
../../gcc/toplev.c: At top level:
../../gcc/toplev.c:524:1: error: redefinition of ‘floor_log2’
floor_log2 (unsigned HOST_WIDE_INT x)
^
In file included from ../../gcc/toplev.c:59:0:
../../gcc/toplev.h:175:1: note: previous definition of ‘floor_log2’ was here
floor_log2 (unsigned HOST_WIDE_INT x)
^
../../gcc/toplev.c:559:1: error: redefinition of ‘exact_log2’
exact_log2 (unsigned HOST_WIDE_INT x)
^
In file included from ../../gcc/toplev.c:59:0:
../../gcc/toplev.h:181:1: note: previous definition of ‘exact_log2’ was here
exact_log2 (unsigned HOST_WIDE_INT x)
^
Makefile:2064: recipe for target 'toplev.o' failed
make[2]: *** [toplev.o] Error 1
make[2]: Leaving directory '/tmp/yaourt-tmp-michael/aur-gcc41/src/gcc-4.1.2/build/gcc'
Makefile:3907: recipe for target 'all-gcc' failed
make[1]: *** [all-gcc] Error 2
make[1]: Leaving directory '/tmp/yaourt-tmp-michael/aur-gcc41/src/gcc-4.1.2/build'
Makefile:617: recipe for target 'all' failed
make: *** [all] Error 2
答案1
gcc 4.4.7
我也尝试安装较新的gcc
版本。我见过和你一样的错误。根据这个错误报告,问题来自于 flag ,它成为新版本-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
并更改了from中的两行
CC = gcc
CXX = g++
到
CC = gcc -fgnu89-inline
CXX = g++ -fgnu89-inline
有了这个,我就不再看到错误了。
但是,我遇到了其他错误:
@itemx must follow @item
它们是由较新版本的 引起的texinfo
,因此您可以使用较旧版本的texinfo
。也许你也可以手动修复它们,我尝试过一个案例,但我不知道我在做什么,所以我没有遵循这条路。
长话短说,我猜你最好运行虚拟机或 docker 镜像。
答案2
我以前遇到过类似的事情。我认为问题在于您正在尝试使用 GCC 5.2.0-1(最新的 arch 版本)从 AUR 编译 gcc41。随着版本的继续,GCC 会添加新的错误,因此旧版本的 GCC 的源代码不是在较新版本的 GCC 下始终被认为是有效的。如果您能找到一种方法来禁用此警告,则可能会成功。如果您可以使用 Arch wayback 机器获取 gcc 4.2 二进制文件,则可以以二进制形式编译 gcc 4.2 源代码。