конфликт определения структуры между модулем XS и сборкой perl - PullRequest
3 голосов
/ 20 января 2010

В OpenSolaris ($ ^ O eq 'solaris', вер. 2.11) я пытаюсь построить модуль XS, который использует XPGv4v2 / Single Unix Spec. понимание struct msghdr, особенно для опроса "вспомогательных данных".

Однако собственный perl (v5.8.4) был собран без необходимых определений, и поэтому struct msghdr, видимый в моем XS-файле, является более старым, BSD-видом ::

#include "EXTERN.h"
#include "perl.h"      /* older, "msg_accrights"-style msghdr now visible */
#include "XSUB.h"

....
  struct msghdr m;
  m.msg_control = buf;  /* ERROR, structure has no member named "msg_control" */
....

Предоставление "правильных" #define s (_XOPEN_SOURCE и _XOPEN_SOURCE_EXTENDED) нарушает сборку, поскольку она меняет очень многое, чего ожидал Perl.

Есть ли какой-нибудь элегантный способ, которым модуль XS может использовать определение структуры, которое я хотел бы?

1 Ответ

2 голосов
/ 20 января 2010

Вы должны либо использовать определения, которые понимает ваш существующий perl, либо скомпилировать новый perl с определениями, которые вы хотите.

Вам не нужно заменять существующий Perl. Вы можете установить новый Perl отдельно, чтобы он не конфликтовал.

Если вы хотите использовать оба способа, вам нужно выяснить, какие определения есть в вашем Perl, и написать код, который обрабатывает правильный набор определений. Вы можете добавить слой абстракции, чтобы реализовать базовые биты с любым набором определений. Вероятно, это много повторяющийся код, но это, к сожалению, переносимость. (

...