【发布时间】:2016-12-18 01:16:39
【问题描述】:
我需要旧版本的 GCC 来安装 CUDA 工具包,因为 CUDA 工具包不支持 5.3.1 之后的 GCC,而且我尝试安装它的 Fedora 机器带有 GCC 6。我没有太多控制机器,所以我不得不自己构建 GCC。我遵循的步骤是:
$ cd gcc-5.3.0
$ contrib/download_prerequisites
$ cd ../build
$ ../gcc-5.3.0/configure --prefix=$HOME/local/gcc-5.3.0 --program-suffix=5.3 --enable-shared --enable-multiarch --enable-threads=posix --enable-languages=c,c++,fortran --enable-checking=release --with-tune=generic
$ make
这导致configure 成功,但make 失败并出现错误:
cfns.gperf:101:1: error: ‘const char* libc_name_p(const char*, unsigned int)’ redeclared inline with ‘gnu_inline’ attribute
还有一大堆其他 C++11 警告。经过一些谷歌搜索,我认为这与使用 GCC 6 构建 GCC 5 或更早版本有关。我认为如果我可以强制编译器改为遵循 C++98 可能会有所帮助。所以,我尝试了:
$ export CXXFLAGS="-std=gnu++98"
$ ../gcc-5.3.0/configure ...
$ make
没用。我仍然不断收到相同的 C++11 警告,构建失败并出现完全相同的错误。然后,我尝试了:
$ ../gcc-5.3.0/configure CXXFLAGS="-std=gnu++98" ...
$ make
同样的错误。这次我偷看了 Makefile,它确实在这里和那里将 CXXFLAGS 设置为 -std=gnu++98。另外,我也尝试构建 GCC 4.9.3 以查看这是否是与特定版本相关的问题,但我再次遇到相同的错误。
我不确定如何继续。任何帮助深表感谢。谢谢。
【问题讨论】:
-
根据文档gcc.gnu.org/onlinedocs/gcc/Inline.html,
gnu_inline是对 pre-c99 C 代码的 gcc 扩展。由于您拥有源代码,因此您可以找到导致错误的文件并尝试将有问题的声明更改为inline,使其遵循 C99/11 和 C++ 语法,或者更改为__INLINE或__inline__。我的猜测是,您的 C++ 代码包含一些为 C99 之前的 c 代码编写的标头。更多信息在这里:gcc.gnu.org/ml/gcc-patches/2015-08/msg00375.html -
有趣的建议。我尝试了引用链接中提到的更改,它比之前的错误更进一步,但最终失败并出现错误
gcc-5.3.0/gcc/cp/except.c:1043: undefined reference to `libc_name_p(char const*, unsigned int)' collect2: error: ld returned 1 exit status。 -
一一尝试这些解决方案? google.com/…