我想在 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 。您将看到可以设置的环境变量列表,这些变量将更改编译器。这也解释了这里。
我认为这会有效。(我以前也做过类似的事情。)