Golang zmq绑定,ZMQ4,返回包错误,找不到文件zmq.h

时间:2014-03-07 03:05:31

标签: go packages zeromq filepath cgo

我试图在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”文件夹的路径,之前在zmq4顶层文件夹中放置了zmq.h。我没有太多的武器来理解这个问题,因为我是Go的新手C和C导入包

4 个答案:

答案 0 :(得分:2)

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

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

正如@photoionized所指出的那样,在构建Go绑定时需要设置C_INCLUDE_PATHLIBRARY_PATH

(在我的情况下,我在编译libzmq并且未定义IN6_ADDR时遇到了问题。我发现的唯一解决方案是受this issue的启发,手动添加行{{1}到windows.hpp文件。)

答案 1 :(得分:2)

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

  1. 按照说明安装和更新MSYS2 http://sourceforge.net/p/msys2/wiki/MSYS2%20installation/
  2. 根据Go arch(32位或64位)启动mingw32_shell.bat或mingw64_shell.bat
  3. pacman -S mingw-w64-(x86_64|i686)-toolchain make(x86_64代表64位,i686代表32位)
  4. cd进入zeromq src文件夹(C:\ path以shell中的/ 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

答案 2 :(得分:0)

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

  1. 按照http://sourceforge.net/p/msys2/wiki/MSYS2%20installation/
  2. 的说明安装和更新MSYS2
  3. 根据Go arch(32位或64位)启动SELECT SUM(reach) AS reach, SUM(impressions) AS impressions, cpc, id_name, SUM(clicks) AS clicks, SUM(amount_spent) AS amount, pagename, (CASE WHEN MAX(status = 'active') > 0 THEN 'active' ELSE MAX(status) END) as status FROM mbk_ad_data WHERE id_campaign_shortname = 'name' AND adset_name NOT LIKE '%MSN%' AND date_from = '2016-02-02' AND date_to = '2016-02-09' GROUP BY id_name, cpc, id_name, pagename; mingw32_shell.bat
  4. mingw64_shell.bat(x86_64代表64位,i686代表32位)
  5. pacman -S mingw-w64-(x86_64|i686)-toolchain make添加到您的路径(pkg-config就在那里)
  6. 重新启动msys2 shell以获取新路径
  7. 下载并解压缩libsodium来源:https://github.com/jedisct1/libsodium/releases
  8. C:\msys64\mingw64\bin进入libsodium文件夹(C:\ path以shell中的/ c /开头)
  9. cd
  10. ./configure --build=(x86_64|i686)-w64-mingw32
  11. make
  12. make install添加到/usr/local/libPKG_CONFIG_PATH
  13. cd into zeromq src folder
  14. export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig
  15. 添加

    ./configure --build=(x86_64|i686)-w64-mingw32

    #ifdef ZMQ_HAVE_MINGW32

    #include <winsock2.h>

    #include <windows.h>

    #include "netioapi.h"

  16. #endif

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

      CGO_CFLAGS=-I/usr/local/include CGO_LDFLAGS=-L/usr/local/lib go build /usr/local/bin/libzmq.dll /mingw(32|64)/bin/libgcc*.dll /mingw(32|64)/bin/libwinpthread-*.dll /mingw(32|64)/bin/libstdc++*.dll

    7. 可能? /usr/local/bin/libsodium-*.dll

答案 3 :(得分:0)

使用MSYS2的更新答案。

  1. 安装MSYS2 MSYS2 installation guide
  2. 确保选择正确的32位或64位安装。
  3. 打开相应的外壳MSYS2 MinGW 64-bitMSYS2 MinGW 32-bit所有其他步骤均假定您正在使用此外壳程序
  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. 添加转到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