1 编译 问题

以下是有关从源代码编译 Zabbix 的已知 问题。有关所有其他情况,请参阅 Known issues 页面。

在 HP-UX 上编译 Zabbix agent

如果您从流行的 HP-UX 软件包站点 http://hpux.connect.org.uk 安装 PCRE 库 (例如,从 file pcre-8.42-ia64_64-11.31.depot 安装),则库的 64-位 version 将被安装在 /usr/local/lib/hpux64 目录中。

在这种情况下,为了成功编译 agent,需要为 configure 脚本自定义一个选项,例如:

CFLAGS="+DD64" ./configure --enable-agent --with-libpcre-include=/usr/local/include --with-libpcre-lib=/usr/local/lib/hpux64

非标准路径下的库

Zabbix 允许您指定一个位于非标准位置的库。在下面的示例中,Zabbix 将从指定的非标准位置加载 run curl-config 并使用其输出来确定要使用的正确 libcurl。

$ ./configure --enable-server --with-mysql --with-libcurl=/usr/local/bin/curl-config

如果这是系统中安装的唯一 libcurl,则此方法有效,但如果在标准位置(例如,由软件包管理器)安装了另一个 libcurl,则可能无效。当你需要为 Zabbix 使用较新的库版本 version,而其他应用程序需要旧版本时,就会出现这种情况。

因此,当同一组件也存在于标准位置时,在非标准位置指定该组件并不总是有效。

例如,如果你在仍安装有 libcurl 包的情况下使用安装在 /usr/local 中的较新 libcurl,Zabbix 可能会加载错误的库,从而导致编译失败:

usr/bin/ld: ../../src/libs/zbxhttp/libzbxhttp.a(http.o): 在函数 'zbx_http_convert_to_utf8' 中:
       /tmp/zabbix-master/src/libs/zbxhttp/http.c:957: 对 'curl_easy_header' 的未定义引用
       collect2: 错误:ld 返回了 1 退出状态

此处,函数 curl_easy_header() 在较旧的 /usr/lib/x86_64-linux-gnu/libcurl.so 中不可用,但在较新的 /usr/local/lib/libcurl.so 中可用。

问题出在链接器标志的顺序上,一个解决方案是在 LDFLAGS 变量中指定库的完整路径:

$ LDFLAGS="-Wl,--no-as-needed /usr/local/lib/libcurl.so" ./configure --enable-server --with-mysql --with-libcurl=/usr/local/bin/curl-config

注意 -Wl,--no-as-needed 选项,某些系统上可能需要该选项(另请参阅:Debian-based 系统上的默认链接选项)。

某些系统上堆栈大小过小

如果由于堆栈溢出导致 Zabbix 崩溃或冻结,您可以在 configuring the sources 时使用 --with-stacksize 选项来增加每个线程的堆栈大小。
此 问题 可能在默认线程堆栈限制较低的系统上发生,尤其是在 preprocessing 期间创建多个线程时。

以下示例将每个线程的堆栈大小设置为 512 KB:

./configure --enable-server --with-mysql --with-stacksize=512

在基于 Linux 的系统上,您可以使用 ulimit -s 命令在运行时检查系统的线程堆栈限制。