编译Perl 5.12.1(RHEL 5.5)时出错

我正在尝试在Red Hat Enterprise Linux 5.5的主目录中编译Perl 5.12.1。 但是,当我尝试制作时,我最终收到以下错误:

Making IO (all) make[1]: Entering directory `/users/rmi1/build/perl-5.12.0/dist/IO' make[1]: Leaving directory `/users/rmi1/build/perl-5.12.0/dist/IO' Making all in dist/IO make all PERL_CORE=1 LIBPERL_A=libperl.a LINKTYPE=dynamic make[1]: Entering directory `/users/rmi1/build/perl-5.12.0/dist/IO' cc -c -fno-strict-aliasing -pipe -fstack-protector -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -O2 -DVERSION=\"1.25_02\" -DXS_VERSION=\"1.25_02\" -fPIC "-I../.." IO.c IO.xs: In function 'XS_IO__Poll__poll': IO.xs:249: error: invalid application of 'sizeof' to incomplete type 'struct pollfd' IO.xs:253: error: invalid use of undefined type 'struct pollfd' IO.xs:253: error: dereferencing pointer to incomplete type IO.xs:255: error: invalid use of undefined type 'struct pollfd' IO.xs:255: error: dereferencing pointer to incomplete type IO.xs:257: error: invalid use of undefined type 'struct pollfd' IO.xs:257: error: dereferencing pointer to incomplete type IO.xs:261: error: invalid use of undefined type 'struct pollfd' IO.xs:261: error: dereferencing pointer to incomplete type IO.xs:262: error: invalid use of undefined type 'struct pollfd' IO.xs:262: error: dereferencing pointer to incomplete type make[1]: *** [IO.o] Error 1 make[1]: Leaving directory `/users/rmi1/build/perl-5.12.0/dist/IO' Unsuccessful make(dist/IO): code=512 at make_ext.pl line 449. make: *** [lib/auto/IO/IO.so] Error 2 

什么可能导致这个?

我只是遇到了同样的问题,并追查了根本原因: C_INCLUDE_PATH环境variables。 我碰巧设置如下:

 % printenv C_INCLUDE_PATH C_INCLUDE_PATH=/home/me/REDACTED/include: 

这来自某个login脚本,正在做类似的事情

 export C_INCLUDE_PATH=$HOME/REDACTED/include:$C_INCLUDE_PATH 

同时build立我的环境。 乍一看看起来很正确; 不幸的是,似乎是foo:相当于foo:. 在这个上下文中 – 也就是说,在两个项目冒号分隔的列表中的空string似乎被隐式地对待. 。 这有效地将当前目录添加到系统包含path,这使得#include <poll.h>#include "poll.h"做同样的事情,这是不好的。

在Perl的情况下,stream氓包括path导致Perl的poll.h包括自己而不是/usr/include/poll.h 。 由于Perl的poll.h有防止多重包含,第二个包含默默无闻,最终没有poll.h ,这很快就导致了我们都看到的编译器错误。 这也解释了为什么你的补丁使问题消失:编译目录中没有./sys/poll.h ,所以编译器最终find/usr/include/sys/poll.h ,最终碰巧是你自找的。

我的解决scheme是摆脱C_INCLUDE_PATH中的stream浪冒号。 在我的情况下,我发现该脚本设置不正确,并修复它,以便明确检查以前的C_INCLUDE_PATH是空的情况下,而不是在这种情况下添加冒号。 当然,作为一个快速的一次性修复,我也可以在构buildPerl之前手动运行export C_INCLUDE_PATH=/home/me/REDACTED/include unset C_INCLUDE_PATH export C_INCLUDE_PATH=/home/me/REDACTED/include或者只是unset C_INCLUDE_PATH

我的猜测是你缺lesspoll.h.

顺便说一句,为什么不使用rpm来安装Perl? 这会更容易。

希望这可以帮助。

我发现perl带有一个本地的poll.h,如果你没有正确的头文件,它会试图模拟poll()的function; 这是位于/dist/IO/poll.h(根位于tarball的根目录)。 由于RHEL 5.5具有poll.h,因此/ Configure已经检测到它的存在,并将其自身设置为使用系统poll.h而不是自己的。 在/dist/IO/poll.h下面的diff让它起作用:

 14c14 < # include <poll.h> --- > # include <sys/poll.h> 

我真的不知道为什么<poll.h>即使<sys/poll.h>不起作用。 我的<poll.h> (位于/usr/include/poll.h)如下:

 #include <sys/poll.h>