4

我试图在 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 导入包的新手

4

4 回答 4

2

ZeroMQ 的 Windows 安装程序版本不适用于 zmq4,您需要使用 gcc 从源代码编译,我建议使用 MSYS2。

  1. 按照http://sourceforge.net/p/msys2/wiki/MSYS2%20installation/中的说明安装和更新 MSYS2
  2. 启动基于 Go 架构的 mingw32_shell.bat 或 mingw64_shell.bat (32bit or 64bit)
  3. pacman -S mingw-w64-(x86_64|i686)-toolchain make(x86_64 用于 64 位,i686 用于 32 位)
  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
于 2015-01-28T10:19:28.760 回答
2

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

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

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

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

于 2014-08-15T12:48:27.143 回答
0

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

  1. 按照http://sourceforge.net/p/msys2/wiki/MSYS2%20installation/中的说明安装和更新 MSYS2
  2. 启动mingw32_shell.batmingw64_shell.bat基于 Go 架构(32 位或 64 位)
  3. pacman -S mingw-w64-(x86_64|i686)-toolchain make(x86_64 用于 64 位,i686 用于 32 位)
  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/libPKG_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

于 2016-02-09T14:49:04.207 回答
0

使用 MSYS2 的更新答案。

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

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

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

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

  11. 在可能失败的情况下。注释掉else配置文件中的空子句。

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

  13. 安装 Go 包: CGO_CFLAGS=-I/usr/local/include CGO_LDFLAGS=-L/usr/local/lib go get github.com/pebbe/zmq4
于 2018-08-22T15:30:49.827 回答