我刚刚从源代码在 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 -lresolv
到AUXLIBS
。
答案2
postfix
Ubuntu 上的软件包将自动安装全部安装所依赖的库,称为“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 的。