为什么我无法编译这个版本的 Postfix?

为什么我无法编译这个版本的 Postfix?

我刚刚从源代码在 Ubuntu 服务器上安装了 postfix 2.7.11。我没有使用 ubuntu 自己的版本,因为我需要旧版本。

我发现了一个很有趣的问题。之前在 CentOS 5 和 6 上,我都可以毫无问题地构建源代码。但是在 Ubuntu server 12.04 上却完全不同。

我遇到了以下问题:

dict_nis.c:173: error: undefined reference to 'yp_match'
dict_nis.c:187: error: undefined reference to 'yp_match'

dns_lookup.c:347: error: undefined reference to '__dn_expand'
dns_lookup.c:218: error: undefined reference to '__res_search'
dns_lookup.c:287: error: undefined reference to '__dn_expand'
dns_lookup.c:498: error: undefined reference to '__dn_expand'
dns_lookup.c:383: error: undefined reference to '__dn_expand'

是的,这个原因很明显。我只需搜索相关库并将其添加到 makefile 中。它就起作用了。

问题是为什么?Ubuntu Server 和 CentOS 有什么区别?

一种可能性是 gcc 和 ld 版本。Ubuntu 服务器使用与 CentOS 不同的 gcc 和 ld 版本。但我不确定。

答案1

您应该附加-ldb -lnsl -lresolvAUXLIBS

答案2

postfixUbuntu 上的软件包将自动安装全部安装所依赖的库,称为“Build Dependencies”。

我建议您安装显示的所有构建依赖包在这个链接然后尝试重建,很可能您缺少某些用于编译的库。

答案3

最后在别人的帮助下,我找到了原因。Ubuntu
有特殊的 .so 位置。该位置与 CentOS 不同。
但在 Postfix makedefs 文件中,它不包含此特定位置。让我们检查一下源代码:

SYSLIBS="-ldb"
        for name in nsl resolv
        do
            for lib in /usr/lib64 /lib64 /usr/lib /lib
            do
            test -e $lib/lib$name.a -o -e $lib/lib$name.so && {
                SYSLIBS="$SYSLIBS -l$name"
                break
            }
            done
        done 

这里,make 时会用到 SYSLIBS。这个脚本会检查一些特殊的文件夹来添加 .so lib。但这些位置不包括 Ubuntu 的。

相关内容