代码之家  ›  专栏  ›  技术社区  ›  pilcrow

XS模块和Perl构建之间的结构定义冲突

  •  3
  • pilcrow  · 技术社区  · 14 年前

    在OpenSolaris($^o eq'solaris',vers)上。2.11),我正在尝试构建一个使用xpgv4v2/单个unix规范的xs模块。了解 struct msghdr 专门用于“辅助数据”查询。

    但是,本机Perl(v5.8.4)的构建没有必要的定义,因此 MSGHDR结构 在我的XS文件中可见的是较旧的BSD类型:

    #include "EXTERN.h"
    #include "perl.h"      /* older, "msg_accrights"-style msghdr now visible */
    #include "XSUB.h"
    
    ....
      struct msghdr m;
      m.msg_control = buf;  /* ERROR, structure has no member named "msg_control" */
    ....
    

    提供“权利” #define S( _XOPEN_SOURCE _XOPEN_SOURCE_EXTENDED )破坏了构建,因为它改变了Perl所期望的许多事情。

    有没有一种优雅的方法可以让XS模块使用我想要的结构定义?

    1 回复  |  直到 14 年前
        1
  •  2
  •   brian d foy JRFerguson    14 年前

    您要么必须使用现有Perl理解的定义,要么使用您想要的定义编译一个新的Perl。

    不过,您不需要替换现有的Perl。您可以单独安装新的Perl,这样它们就不会发生冲突。

    如果您同时需要这两种方法,您必须弄清楚Perl具有哪些定义,并编写处理正确定义集的代码。您可以添加一个抽象层,这样就可以用任意一组定义来实现底层位。可能有很多重复的代码,但不幸的是,这就是可移植性。:。(