我正在尝试使用ExtUtils :: Constant从系统标头导出C常量。
根据文档,我在Makefile.PL中:
ExtUtils::Constant::WriteConstants (
NAME => 'Foo::Bar',
NAMES => [ qw(EPOLLIN EPOLLOUT) ]
);
然后在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文档说它使用AUTOLOAD。为了使裸字起作用,需要将它们定义为“真实”常量。
关于perl - 使用ExtUtils::Constants访问系统常量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22433226/