0

我维护了一个由 Perl 和 Cyrus IMAP 等组成的软件堆栈。

Perl 似乎运行良好,Cyrus cyradm(一个 perl 脚本)也运行良好。但是,sieveshell 将不会执行并在此处寻求帮助的理由。

当我运行 sieveshell 时,我得到以下输出:

无法为模块 Cyrus 加载“/usr/local/pozix/perl-5.10.0/lib/site_perl/5.10.0/i686-linux-thread-multi/auto/Cyrus/SIEVE/managesieve/managesieve.so”: :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: 未定义符号: PQfinish 在 /usr/local/pozix/perl-5.10.0/lib/5.10.0/i686-linux-thread-multi/DynaLoader.pm 第 203 行。在 ./sieveshell 第 45 行编译失败在 ./sieveshell 行45. BEGIN failed - 编译在 ./sieveshell 第 45 行中止。

PQfinish 是 PostgreSQL 库的一部分。如果我在 managesieve.so 上运行 ldd,PGSQL 库没有链接,但是也没有丢失的库。如果我在列出的 libsasl2 库上运行 ldd,它看起来也不错,并且确实使用了 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/local/pozix/cyrus-sasl/lib/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 在每个子目录中构建 Makefile。managesieve.so 库是通过 Perl 的调用创建的... IE 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

这解决了它!

4

1 回答 1

0

听起来您需要重新编译 sieve 共享库并包含-lPGSql(或其他)。是否有需要添加“--with-postgres”的配置脚本?如果没有,您可能必须手动编辑 Makefile(或 Makefile.PL 或 Build.PL)。

于 2009-08-18T12:39:18.887 回答