Назад | Перейти на главную страницу

Ошибка при компиляции Perl 5.12.1 (RHEL 5.5)

Я пытаюсь скомпилировать 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? Было бы проще.

Надеюсь это поможет.