【问题标题】:Golang zmq binding, ZMQ4, returns package error not finding file zmq.hGolang zmq 绑定,ZMQ4,返回包错误未找到文件 zmq.h
【发布时间】:2014-04-10 01:00:51
【问题描述】:

我试图在 Go 应用程序中包含 ZMQ 套接字,但是 zmq4 和 gozmq(Go 的 ZMQ 绑定库)都给我带来了问题。我想了解为什么 zmq4 特别不能在我的系统上导入。

我运行的是 Windows 8 系统,我使用了 ZMQ 网站上的 Windows 安装程序 4.0.3 版。我主要关心的是设置 zmq4,这是我对 github 库位置的“go get”查询的结果:

> go get github.com/pebbe/zmq4
# github.com/pebbe/zmq4
polling.go:4:17: fatal error: zmq.h: No such file or directory
compilation terminated.

克隆 Github 存储库并不能缓解此问题 - 错误仍然存​​在。

我知道这个问题与位于我的 ZMQ 安装的“include”文件夹中的 C 库 zmq.h 有关,但是依赖关系是由路径问题还是外部工具问题引起还是个谜对我来说。

关于 node.js 也出现了类似的错误,这是我看到其他人在节点脚本之外提到的解决方案,但在我的情况下它是不成功的。

到目前为止,我已经在我的 PATH 环境变量中包含了“include”文件夹的路径,并且之前将 zmq.h 放在了 zmq4 顶级文件夹中。我没有太多的武器库来理解这个问题,因为我是 Go 中 C 和 C 导入包的新手

【问题讨论】:

  • 如果不提供更多信息,我认为您不会得到答案。你用的是什么平台?你是如何安装 ZMQ 的?您使用什么命令来尝试构建 gozmq?
  • 我已经编辑了更多信息,如果我错过了什么,请告诉我还需要什么。此外,我主要对 zmq4 错误的解决方案感兴趣;我对 gozmq 挂起的内容有了更好的了解
  • @user2628946 有什么进展吗?我对 zmq4 也有同样的问题,gozmq 给了我:# pkg-config --cflags libzmq libzmq libzmq libzmq exec: "pkg-config": executable file not found in %PATH%
  • @user2628946:尝试设置环境变量 C_INCLUDE_PATH 和 LIBRARY_PATH 以包含您的 zmq 安装,或者,如果 zmq4 使用 pkg-config,则添加一个包含您的安装信息的 .pc 文件...它听起来您将 zmq 安装在非标准位置,而 go build 并没有捡起它。 @10cls:看起来 gozmq 使用 pkg-config 来获取针对 libzmq 构建的标志,而您没有安装 pkg-config。安装它并确保您的 zmq 安装具有有效的 *.pc 文件,然后重试。

标签: go packages zeromq filepath cgo


【解决方案1】:

使用 MSYS2 的更新答案。

  1. 安装 MSYS2 MSYS2 installation guide。
  2. 确保选择正确安装 32 位或 64 位。
  3. 打开相应的外壳MSYS2 MinGW 64-bit 或MSYS2 MinGW 32-bit。 所有进一步的步骤都假设您使用的是这个 shell。
  4. 按照installation guide 的说明更新软件包。
  5. 安装 libtool pacman -Sy libtool.
  6. 将zmq source code 下载到您选择的位置。
  7. 导航到 zmq 源文件夹。
  8. 要生成配置文件,请通过运行./autogen.sh 运行 autogen 工具。
  9. 在第 8 步可能失败的情况下:

    1. 查找故障的file(可能是version.sh)。
    2. 将行尾替换为(将file 替换为实际文件名)。
      cp file file.bak

      tr -d '\r' <file.bak> file

    3. 如果失败,您将不得不深入研究代码并找出问题所在。
  10. 运行配置工具./configure。

  11. 在可能发生故障的情况下。注释掉配置文件中的空 else 子句。

  12. 添加转到Path:PATH=${PATH}:<go bin directory>。

  13. 安装 Go 包:CGO_CFLAGS=-I/usr/local/include CGO_LDFLAGS=-L/usr/local/lib go get github.com/pebbe/zmq4

【讨论】:

    【解决方案2】:

    以下是@user2172816 的 MSYS2 解决方案的更新步骤:

    1. 按照http://sourceforge.net/p/msys2/wiki/MSYS2%20installation/ 的说明安装和更新 MSYS2
    2. 基于 Go 架构(32 位或 64 位)启动 mingw32_shell.bat 或 mingw64_shell.bat
    3. pacman -S mingw-w64-(x86_64|i686)-toolchain make(64 位为 x86_64,32 位为 i686)
    4. 将C:\msys64\mingw64\bin 添加到您的路径(pkg-config 在那里)
    5. 重新启动 msys2 shell 以获取新路径
    6. 下载并解压 libsodium 源:https://github.com/jedisct1/libsodium/releases
    7. cd 进入 libsodium 文件夹(C:\ 路径以 /c/ 开头)
    8. ./configure --build=(x86_64|i686)-w64-mingw32
    9. make
    10. make install
    11. 将/usr/local/lib 添加到PKG_CONFIG_PATH (export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig)
    12. cd 到 zeromq src 文件夹
    13. ./configure --build=(x86_64|i686)-w64-mingw32
    14. 添加

      #ifdef ZMQ_HAVE_MINGW32

      #include <winsock2.h>

      #include <windows.h>

      #include "netioapi.h"

      #endif

    到src/tcpaddress.cpp的顶部

    1. make
    2. make install
    3. CGO_CFLAGS=-I/usr/local/include CGO_LDFLAGS=-L/usr/local/lib go get github.com/pebbe/zmq4
    4. CGO_CFLAGS=-I/usr/local/include CGO_LDFLAGS=-L/usr/local/lib go build 在你的项目目录中
    5. 复制以下dll并将它们放在您的go程序(.exe)旁边:

      /usr/local/bin/libzmq.dll /mingw(32|64)/bin/libgcc*.dll /mingw(32|64)/bin/libwinpthread-*.dll /mingw(32|64)/bin/libstdc++*.dll /usr/local/bin/libsodium-*.dll

    也许? /usr/local/bin/libsodium-*.def

    【讨论】:

      【解决方案3】:

      ZeroMQ 的 Windows 安装程序版本无法与 zmq4 一起使用,您需要使用 gcc 从源代码编译,我建议使用 MSYS2。

      1. 按照以下说明安装和更新 MSYS2 http://sourceforge.net/p/msys2/wiki/MSYS2%20installation/
      2. 基于 Go 架构(32 位或 64 位)启动 mingw32_shell.bat 或 mingw64_shell.bat
      3. pacman -S mingw-w64-(x86_64|i686)-toolchain make (x86_64 for 64bit, i686 for 32bit)
      4. cd 进入 zeromq src 文件夹(C:\ 路径以 /c/ 开头)
      5. ./configure
      6. make
      7. make install
      8. CGO_CFLAGS=-I/usr/local/include CGO_LDFLAGS=-L/usr/local/lib go get github.com/pebbe/zmq4
      9. 复制以下 dll 并将它们放在您的 go 程序 (.exe) 旁边: /usr/local/bin/libzmq.dll /mingw(32|64)/bin/libgcc*.dll /mingw(32|64)/bin/libwinpthread*.dll /mingw(32|64)/bin/libstdc++*.dll

      【讨论】:

        【解决方案4】:

        我想做同样的事情,但在 Windows 7 上,这是我必须做的。

        由于 Go 绑定使用 cgo 与 zeromq 集成,因此您需要使用 gcc 构建的 zeromq。没有预先构建的二进制文件,因此您必须自己构建它们,使用 mingw 或类似的,但这个过程比听起来容易,并且在 zeromq site 上有很好的描述。

        正如@photoionized 所指出的,C_INCLUDE_PATH 和 LIBRARY_PATH 在构建 Go 绑定时需要设置。

        (在我的例子中,我在编译 libzmq 时遇到了一个问题,其中 IN6_ADDR 没有被定义。我发现的唯一解决方案是,受 this issue 的启发,手动将行 #include <in6addr.h> 添加到 windows.hpp文件。)

        【讨论】:

          猜你喜欢
          • 2021-07-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-06-18
          • 2010-11-04
          • 1970-01-01
          • 1970-01-01
          • 2020-09-03
          相关资源
          最近更新 更多