在 Ubuntu 18.04 中安装旧版本的 gnu-make

在 Ubuntu 18.04 中安装旧版本的 gnu-make

我想在 Ubuntu 18.04 上安装 make 3.81。

所以我下载了这个版本的 make 并运行。/配置进而制作。但是在编译时出现此错误:

./glob/glob.c: In function ‘glob’:
./glob/glob.c:581:23: warning: implicit declaration of function ‘__alloca’; did you mean ‘alloca’? [-Wimplicit-function-declaration]
       newp = (char *) __alloca (dirlen + 1);
                       ^~~~~~~~
                       alloca
./glob/glob.c:581:14: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
       newp = (char *) __alloca (dirlen + 1);
              ^
./glob/glob.c:709:15: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
        newp = (char *) __alloca (home_len + dirlen);
               ^
./glob/glob.c:732:15: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
        newp = (char *) __alloca (end_name - dirname);
               ^
./glob/glob.c:783:15: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
        newp = (char *) __alloca (home_len + rest_len + 1);
               ^
./glob/glob.c:814:11: warning: implicit declaration of function ‘__stat’; did you mean ‘__xstat’? [-Wimplicit-function-declaration]
         : __stat (dirname, &st)) == 0
           ^~~~~~
           __xstat
./glob/glob.c: In function ‘glob_in_dir’:
./glob/glob.c:1256:21: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
    char *fullname = (char *) __alloca (dirlen + 1 + patlen + 1);
                     ^
./glob/glob.c:1283:12: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
    names = (struct globlink *) __alloca (sizeof (struct globlink));
            ^
./glob/glob.c:1341:32: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
         struct globlink *new = (struct globlink *)
                                ^
./glob/glob.c:1367:15: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
       names = (struct globlink *) __alloca (sizeof (struct globlink));

构建版本 3.82 时的情况相同。我当前的 make 版本是 4.1。

有人知道可能出了什么问题吗?

谢谢

编辑:

glob/libglob.a(glob.o):在函数“glob_in_dir”中:
/opt/make-3.81/glob/glob.c:1361: 对“__alloca”未定义引用
/opt/make-3.81/glob/glob.c:1336: 对“__alloca”未定义引用
/opt/make-3.81/glob/glob.c:1277: 对“__alloca”未定义引用
/opt/make-3.81/glob/glob.c:1250: 对“__alloca”未定义引用
glob/libglob.a(glob.o): 在函数“glob”中:
/opt/make-3.81/glob/glob.c:575: 对“__alloca”未定义引用
glob/libglob.a(glob.o):/opt/make-3.81/glob/glob.c:726:更多对“__alloca”的未定义引用如下
collect2:错误:ld 返回 1 退出状态
Makefile:410:目标“make”的配方失败
make[2]:*** [make] 错误 1
make[2]: 离开目录 '/opt/make-3.81'
Makefile:603:目标“全递归”的配方失败
make[1]: *** [全递归] 错误 1
make[1]: 离开目录 '/opt/make-3.81'
Makefile:326:目标“全部”的配方失败
make:*** [全部] 错误 2

答案1

这看起来是 gcc 版本 7.3.0(Ubuntu 7.3.0-27ubuntu1~18.04)的问题

由于某种原因,编译器的默认 #define 与 make 的预期不一致。我在制作最新版本的 make-4.2.1 时遇到了同样的问题。

我将 glob/glob.c 的第 211 行及以后的内容改为:

if  1 // !defined __alloca && !defined __GNU_LIBRARY__

if 1  // ifdef        __GNUC__
 undef alloca
 define alloca(n)     __builtin_alloca (n)

强制 glob.c 使用内置命令。这有效。而且似乎这也是旧版 make 的问题。

我在 Ubuntu 16.04 下制作 make 时没有遇到这个问题。

答案2

gcc 的每个新版本都会根据标准或更好地遵守标准而略有变化。我注意到的一件事是它变得越来越严格。因此,例如,您可能有 5 年前的代码,这些代码在 5 年前可以编译得很好,但使用最新版本的 gcc,您可能会收到所有这些警告和错误。

看起来在 Ubuntu Trusty 中使用了 make 3.81: 制作 3.81. Ubuntu Trusty 似乎也在使用gcc 4.8.2。因此,您可以尝试的一件事是安装 gcc 4.x 并使用它来编译。

在 Ubuntu 18.04 中,安装软件包 gcc-4.8 。然后输入 ./configure --help 。您将看到可以设置的环境变量列表,这些变量将更改编译器。这也解释了这里

我认为这会有效。(我以前也做过类似的事情。)

相关内容