You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ubuntu 22.04 LTS编译ZeroMQ v4.3.4时make执行失败

构建与安装ZeroMQ

此前在Ubuntu 18.04.6 LTS系统上可成功编译ZMQ 4.3.2版本,系统升级为Ubuntu 22.04 LTS、ZMQ版本升级至4.3.4后,安装流程出现失败。

环境信息

  • libzmq版本:v4.3.4
  • 操作系统:Ubuntu 22.04 LTS (Jammy)
  • GCC版本:12.0.1
  • G++版本:12.0.1
  • Make版本:4.3

问题复现步骤

  1. 克隆4.3.4版本源码
  2. 进入zeromq目录
  3. 执行./autogen.sh
  4. 为configure脚本添加可执行权限
  5. 执行配置命令./configure --prefix=/XXX/XXX --enable-shared --with-libsodium --disable-static --disable-werror --without-docs,完成后执行make -j8

实际运行报错

Making all in doc
make[1]: Entering directory '/mnt/zeromq/doc'
make[1]: Nothing to be done for 'all'.
make[1]: Leaving directory '/mnt/zeromq/doc'
make[1]: Entering directory '/mnt/zeromq'
  CXX      tools/curve_keygen.o
  CXX      src/libzmq_la-curve_client.lo
  CXX      src/libzmq_la-rep.lo
  CXX      src/libzmq_la-req.lo
  CXX      src/libzmq_la-router.lo
  CXX      src/libzmq_la-scatter.lo
  CXX      src/libzmq_la-select.lo
  CXX      src/libzmq_la-server.lo
  CXX      src/libzmq_la-session_base.lo
  CXX      src/libzmq_la-signaler.lo
  CXX      src/libzmq_la-socket_base.lo
  CXX      src/libzmq_la-socks.lo
  CXX      src/libzmq_la-socks_connecter.lo
  CXX      src/libzmq_la-stream.lo
In file included from /usr/include/string.h:535,
                 from src/err.hpp:39,
                 from src/msg.hpp:37,
                 from src/curve_client.cpp:35:
In function 'void* memcpy(void*, const void*, size_t)',
    inlined from 'static int zmq::curve_client_tools_t::produce_initiate(void*, size_t, uint64_t, const uint8_t*, const uint8_t*, const uint8_t*, const uint8_t*, const uint8_t*, const uint8_t*, const uint8_t*, const uint8_t*, size_t)' at src/curve_client_tools.hpp:186:16:
/usr/include/x86_64-linux-gnu/bits/string_fortified.h:29:33: error: 'void* __builtin_memcpy(void*, const void*, long unsigned int)' offset [0, 79] is out of the bounds [0, 0] [-Werror=array-bounds]
   29 |   return __builtin___memcpy_chk (__dest, __src, __len,
      |          ~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
   30 |                                  __glibc_objsize0 (__dest));
      |                                  ~~~~~~~~~~~~~~~~~~~~~~~~~~
cc1plus: all warnings being treated as errors
  CXX      src/libzmq_la-stream_connecter_base.lo
make[1]: *** [Makefile:5394: src/libzmq_la-curve_client.lo] Error 1
make[1]: *** Waiting for unfinished jobs....
make[1]: Leaving directory '/mnt/zeromq'
make: *** [Makefile:8216: all-recursive] Error 1
----------------------------------------
[ ERROR(2) ]

问题原因

GCC 12版本新增了更严格的数组边界静态检查逻辑,ZMQ 4.3.4版本中curve_client_tools.hpp内的memcpy调用写法会被编译器误判为向长度为0的缓冲区拷贝数据,虽然配置时加了--disable-werror参数,但该编译选项未覆盖到所有编译单元,警告被直接当成错误终止编译。

解决方法

  • 临时编译绕过:先执行make clean清理旧编译产物,再执行make -j8 CXXFLAGS="-Wno-array-bounds -Wno-error",手动追加参数关闭数组边界检查的报错规则,即可完成编译
  • 版本升级:直接使用v4.3.5及以上版本的libzmq源码,官方已经合入GCC 12的兼容修复补丁,不需要额外调整编译参数即可正常编译安装
  • 源码修改:如果不想调整编译参数也不升级版本,可手动修改src/curve_client_tools.hpp第186行附近的memcpy调用,将目标指针强转为明确长度的类型,消除编译器的误判。

预期结果

按上述方法调整后,make流程可正常执行完成,后续执行make install即可完成ZeroMQ的安装部署。

内容的提问来源于stack exchange,提问作者samadhan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 01:45:44