Я пытаюсь скомпилировать Perl 5.12.1 в своем домашнем каталоге Red Hat Enterprise Linux 5.5. Однако, когда я пытаюсь сделать это, я получаю следующую ошибку:
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
переменная окружения. У меня получилось установить следующее:
% printenv C_INCLUDE_PATH
C_INCLUDE_PATH=/home/me/REDACTED/include:
Это произошло из-за сценария входа в систему, который делал что-то вроде
export C_INCLUDE_PATH=$HOME/REDACTED/include:$C_INCLUDE_PATH
при настройке моей среды. На первый взгляд это выглядит правильно; к сожалению, похоже, что foo:
эквивалентно foo:.
в этом контексте - то есть пустая строка в этом списке из двух пунктов, разделенных двоеточиями, кажется, неявно обрабатывается так же, как .
. Что эффективно добавляет текущий каталог в систему, включая путь, что делает #include <poll.h>
делай то же, что и #include "poll.h"
, что плохо.
В случае Perl неверный путь include вызывает Perl poll.h
включить себя вместо /usr/include/poll.h
. Поскольку Perl poll.h
есть защита от множественного включения, второе включение ничего не делает, и в итоге вы не получаете poll.h
вообще, что быстро приводит к ошибке компилятора, которую мы оба видели. Это также объясняет, почему ваш патч решает проблему: нет ./sys/poll.h
в каталоге сборки, поэтому компилятор найдет /usr/include/sys/poll.h
, что в конечном итоге оказалось именно тем, что вы хотели.
Моим решением было избавиться от шальной толстой кишки в C_INCLUDE_PATH
. В моем случае я нашел скрипт, который устанавливал его неправильно, и исправил его так, чтобы он явно проверял случай, когда предыдущий C_INCLUDE_PATH
было пусто, и в этом случае не добавляйте двоеточие. Конечно, в качестве быстрого одноразового исправления я мог бы запустить вручную export C_INCLUDE_PATH=/home/me/REDACTED/include
или просто unset C_INCLUDE_PATH
перед сборкой Perl.
Я обнаружил, что perl поставляется с локальным poll.h, который пытается имитировать функциональность poll (), если у вас нет нужных заголовков; он находится в /dist/IO/poll.h (корень находится в корне архива). Поскольку в RHEL 5.5 есть poll.h, / Configure обнаружил его присутствие и настроил себя на использование системного poll.h, а не своего собственного. Следующий diff на /dist/IO/poll.h заставил его работать:
14c14
< # include <poll.h>
---
> # include <sys/poll.h>
Я действительно не знаю почему <poll.h>
не работает, хотя <sys/poll.h>
делает. Мой <poll.h>
(находится по адресу /usr/include/poll.h) выглядит следующим образом:
#include <sys/poll.h>
Я предполагаю, что вам не хватает poll.h.
Кстати, почему бы не использовать rpm для установки Perl? Было бы проще.
Надеюсь это поможет.