2009-08-18 3 views
0

Я поддерживаю программный стек, состоящий из Perl и Cyrus IMAP, среди прочего.Как я могу связать файлы PostgreSQL с компиляцией Seivhell Сайруса?

Perl, кажется, работает отлично, и Cyrus cyradm (скрипт perl) отлично работает. Тем не менее, sieveshell не будет выполняться и причина для запроса здесь.

Когда я бегу sieveshell, я получаю выход последующих:

Не удается загрузить «/usr/local/pozix/perl-5.10.0/lib/site_perl/5.10.0/i686-linux -thread-multi/auto/Cyrus/SIEVE/managesieve/managesieve.so 'для модуля Cyrus :: SIEVE :: managesieve: /usr/local/pozix/perl-5.10.0/lib/site_perl/5.10.0/i686- linux-thread-multi/auto/Cyrus/SIEVE/managesieve/managesieve.so: undefined symbol: PQfinish at /usr/local/pozix/perl-5.10.0/lib/5.10.0/i686-linux-thread-multi/ DynaLoader.pm line 203. на ./sieveshell линия 45 Ошибка компиляции в строке ./sieveshell 45. BEGIN failed - компиляция прервана в ./sieveshell строке 45.

PQfinish является частью библиотек PostgreSQL. Если я запустил ldd на managesieve.so, то библиотеки PGSQL не связаны, но также отсутствуют недостающие библиотеки. Если я запустил ldd в библиотеке libsasl2, он тоже выглядит ОК, и он использует PGSQL, но, по-видимому, он не является частью библиотеки, связанной с managesieve.so. Более того, libsasl2 отлично работает при использовании другого программного обеспечения.

Вот LDD managesieve.so

linux-gate.so.1 => (0xffffe000) 
libdb-4.4.so => /lib/libdb-4.4.so (0xb7f8a000) 
libsasl2.so.2 => /usr/local/pozix/cyrus-sasl/lib/libsasl2.so.2 (0xb7f74000) 
libssl.so.0 => /usr/lib/libssl.so.0 (0xb7f33000) 
libcrypto.so.0 => /usr/lib/libcrypto.so.0 (0xb7df6000) 
libc.so.6 => /lib/libc.so.6 (0xb7caa000) 
libpthread.so.0 => /lib/libpthread.so.0 (0xb7c92000) 
libdl.so.2 => /lib/libdl.so.2 (0xb7c8e000) 
libresolv.so.2 => /lib/libresolv.so.2 (0xb7c7b000) 
/lib/ld-linux.so.2 (0xb80aa000) 

LDD USR/местные/pozix/Сайрус-SASL/Библиотека/libsasl2.so.2

linux-gate.so.1 => (0xffffe000) 
libdl.so.2 => /lib/libdl.so.2 (0xb7f0a000) 
libresolv.so.2 => /lib/libresolv.so.2 (0xb7ef7000) 
libc.so.6 => /lib/libc.so.6 (0xb7dab000) 
/lib/ld-linux.so.2 (0xb7f34000) 

Там нет ошибки компиляции во время строительства Cyrus IMAP. Я подозреваю, что это может быть проблемой пути, но не уверен, где искать или отлаживать вывод пути или куда идти дальше.

Пробовал поиск по сайту и получил пару хитов, но у них либо не было решения, либо не работало для меня. Я подозреваю, что Perl AUTOLOAD каким-то образом запутался. DBD :: Pg также работает; используя версию 2.15.1.

Любые предложения о том, куда идти дальше? Любые гуру Perl?

РЕШЕННЫЙ!

./configure создает Make-файлы в каждом подкаталоге. Библиотека managesieve.so создается с помощью вызова Perl ... I.E. Perl Makefile.PL приводит к Makefile. Эндрю посоветовал очень сильно отслеживать это. В Makefile имеются следующие строки:

EXTRALIBS = -ldb-4.4 -L/usr/local/pozix/cyrus-sasl/lib -lsasl2 -lssl -lcrypto 
LDLOADLIBS = -ldb-4.4 -L/usr/local/pozix/cyrus-sasl/lib -lsasl2 -lssl -lcrypto 

Что я обновил следующим образом:

EXTRALIBS = -ldb-4.4 -L/usr/local/pozix/cyrus-sasl/lib -L/usr/local/pozix/pgsql/lib -lsasl2 -lssl -lcrypto -lpq 

LDLOADLIBS = -ldb-4.4 -L/usr/local/pozix/cyrus-sasl/lib -L/usr/local/pozix/pgsql/lib -lsasl2 -lssl -lcrypto -lpq 

И это решаемые его!

ответ

0

Похоже, вам нужно перекомпилировать общую библиотеку сита и включить -lPGSql (или что-то еще). Есть ли сценарий configure, который вам нужно добавить '--with-postgres'? Если нет, вам может потребоваться вручную отредактировать Makefile (или Makefile.PL или Build.PL).

+0

Да, настроечный скрипт вызывается следующим образом: ./configure --prefix = $ POZIX_ROOT/$ Name- $ VERSION \ --with-Сайрус-приставкой = $ POZIX_ROOT/$ Name- $ VERSION/libexec \ --enable-бездействует \ --enable-убийство \ --with-AUTH = Unix \ --with-Сайрус пользователь = Сайрус \ --with-Сайрус-группы = почта \ --with- PgSQL = $ POZIX_ROOT/PgSQL \ --with-SASL = $ POZIX_ROOT/Сайрус-SASL \ --with-сервис-путь = $ POZIX_ROOT/$ Name- $ VERSION/услуги Где $ POZIX_ROOT определен ранее в Сценарий Bash. Последующий make make make, make all & make install. – Eric

+0

То, что я не могу сказать, следующее: если бы я редактировал Makefile, какой? SASL2 или управляющие? Я не вижу ссылки на PQfinish или где libpq.so связан. PQfinish является частью libpq.so, как видно из строк libpq.so | grep PQfinish дает: PQfinish PQfinish Спасибо! – Eric

+0

Проверьте Makefile, сгенерированный скриптом configure, и посмотрите, если ** - с-pgsql ** помещают правильные библиотеки не только в ** - L **, но и в ** - l **. Затем убедитесь, что ваш путь к библиотеке включает libpq.so. И вместо ** строк libpq.so ** попробуйте использовать ** nm ** вместо этого (см. Его страницу руководства). Вы никогда не знаете с ** строками **, если вы видите PQfinish как импортированный символ, а не экспортированный. Еще одна вещь, чтобы проверить это, чтобы убедиться, что у вас нет нескольких версий libpq.so. Возможно, вам придется изменить путь к библиотеке, чтобы получить правильный. –