我正在尝试使用ExtUtils::Constant从系统头导出C常量。
根据文档,我在Makefile.PL中:
ExtUtils::Constant::WriteConstants (
NAME => 'Foo::Bar',
NAMES => [ qw(EPOLLIN EPOLLOUT) ]
);
Then in Bar.xs:
#include "const-c.inc"
#include <sys/epoll.h> // hail mary...
MODULE = Foo::Bar PACKAGE = Foo::Bar
INCLUDE: const-xs.inc
但是,当我使用
运行测试时: is(Foo::Bar::EPOLLOUT, 4);
我:
t/bar.t Bareword "Foo::Bar::EPOLLOUT" not allowed while "strict subs" in use
如果EPOLLOUT作为常量存在,则不会出现这种情况;即,它是一个无效的标识符。
这应该怎么做?我一点也不惊讶这未能将EPOLLOUT设置为正确的值-文档还说ExtUtils::Constant"不包含扫描头文件以提取这些常量的例程序"-但是当生成的.xs
代码超出我的头脑时,我有点惊讶Foo::Bar::EPOLLOUT不被识别为具有undef值的标识符,事实是它没有让我感到困惑下一步要尝试什么。
我会考虑使用ExtUtils::Constant的另一个perl模块的源代码,但我唯一能想到的导出系统定义的是POSIX,这是核心(如果有人知道一个,请留下评论)。
24小时后:现在交叉张贴在Perl Monks.
您可能需要将常量作为函数引用Foo::Bar::EPOLLOUT()
ExtUtils::Constant文档说它使用autolload。要使裸词起作用,它们需要被定义为"实"常数。