【发布时间】:2018-04-25 14:00:25
【问题描述】:
我正在尝试将 Solaris 上的 perl 5.22.2 编译为 64 位(操作系统为 64 位)。
它编译并链接为 32 位二进制文件,现在我已将 -m64 标志添加到 CFLAGS 和 LDFLAGS,我收到以下错误:
...skipping...
perlio.c:3400: error: structure has no member named `_ptr'
perlio.c:3408: error: structure has no member named `_ptr'
perlio.c: In function `PerlIOStdio_get_base':
perlio.c:3531: error: structure has no member named `_base'
perlio.c: In function `PerlIOStdio_get_bufsiz':
perlio.c:3538: error: structure has no member named `_cnt'
perlio.c:3538: error: structure has no member named `_ptr'
perlio.c:3538: error: structure has no member named `_base'
perlio.c: In function `PerlIOStdio_get_ptr':
perlio.c:3547: error: structure has no member named `_ptr'
perlio.c: In function `PerlIOStdio_get_cnt':
perlio.c:3554: error: structure has no member named `_cnt'
perlio.c: In function `PerlIOStdio_set_ptrcnt':
perlio.c:3575: error: structure has no member named `_ptr'
perlio.c:3594: error: structure has no member named `_cnt'
make: *** [perlio.o] Error 1
作为参考,我从perlio.c 中提取了提到的行:
3400: STDCHAR *eptr = (STDCHAR*)PerlSIO_get_ptr(s);
3408: if ((STDCHAR*)PerlSIO_get_ptr(s) != --eptr || ((*eptr & 0xFF) != ch)) {
3531: return (STDCHAR*)PerlSIO_get_base(stdio);
3538: return PerlSIO_get_bufsiz(stdio);
3547: return (STDCHAR*)PerlSIO_get_ptr(stdio);
3554: return PerlSIO_get_cnt(stdio);
3575: PerlSIO_set_ptr(stdio, ptr); /* LHS STDCHAR* cast non-portable */
3594: PerlSIO_set_cnt(stdio, cnt);
看起来它对源做了一些奇怪的事情,注意_ptr 是如何被视为一个单独的实体,而函数被称为PerlSIO_get_ptr。好像被切断了。
有人知道这里发生了什么吗?仅供参考,使用 perlbrew 之类的东西不是一个选项,我需要自己编译:(。
【问题讨论】:
-
您是否重新运行配置以完全检测 64 位选项?看起来您尝试使用已为 32 位构建配置的相同源目录更改编译标志。
-
是的,我在配置和构建之前刚刚解压了源代码。但是我的构建脚本有点复杂,所以我会仔细检查一下没有什么奇怪的事情发生。稍后会报告。
-
您需要确保在配置阶段完成的编译也使用
-m64完成。查看您的配置输出。如果您看到sizeof(long) = 4之类的内容,则说明配置是使用 32 位编译完成的,这将产生不正确的结果。因为 Solaris 上的 32 位FILE结构确实有_ptr和_cnt成员,而 64 位FILE结构是完全不透明的。 -
谢谢@AndrewHenle - 我认为你确实做到了。确实是缺少配置标志导致错误。请看下面我的回答。你帮我找到了解决办法。