【问题标题】:compiling perl as 64 bit on solaris 10 sparc在 solaris 10 sparc 上将 perl 编译为 64 位
【发布时间】:2018-04-25 14:00:25
【问题描述】:

我正在尝试将 Solaris 上的 perl 5.22.2 编译为 64 位(操作系统为 64 位)。 它编译并链接为 32 位二进制文​​件,现在我已将 -m64 标志添加到 CFLAGSLDFLAGS,我收到以下错误:

...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 - 我认为你确实做到了。确实是缺少配置标志导致错误。请看下面我的回答。你帮我找到了解决办法。

标签: c perl gcc 64-bit solaris


【解决方案1】:

事实证明,我需要将-Duse64bitall 标志添加到Configure 脚本中。所以最后我能够用

export CFLAGS=-m64 # not sure if really nessessary - just what I did
./Configure -Duse64bitall -Dcc=gcc -d
make

对于我的设置,我还需要更多库,所以这是一个相当简化的版本。但是它解决了这篇文章中描述的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-03
    • 1970-01-01
    • 1970-01-01
    • 2019-10-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多