如何通过 opam 安装 ZeroMQ

OCaml的多核心支持尚不完善,但是OCaml的单进程性能非常可观,为了能让OCaml充分使用 多核心机器的计算能力,就需要使用Master slave模型和队列模型进行分布式计算。这就不 可避免的使用Socket通讯了,而ZeroMQ是一个非常不错的Socket抽象库,支持消息队列,消 息路由等模式,因此选在在OCaml中使用ZeroMQ进行通讯。

起因

个人最近在学习OCaml和使用ZeroMQ,但是在我的OpenBSD上搞了好久,就是无法通过opam安 装ZeroMQ的绑定。

发现问题

通过观察用户目录下.opam/system/build/可以发现,ZeroMQ的绑定依赖conf-zmq。而 conf-zmq只是尝试编译一个文件test.c。在编译该文件的时候,使用的命令是gcc test.c -lzmq。通过查看test.c其中包含头文件的方式为#include<zmq.h>。根据gcc的参考文件, 在Unix上会在下面这些文件夹中寻找头文件:

/usr/local/include
/usr/lib/gcc-lib/target/version/include
/usr/target/include
/usr/include

但是当我用gcc -v test.c -lzmq的时候,却发现只有:

/usr/include

解决方式

gcc在编译的时候,会使用几个标准的环境变量:

  • C_INCLUDE_PATH
  • CPATH
  • CPLUS_INCLUDE_PATH
  • DEPENDENCIES_OUTPUT
  • OBJC_INCLUDE_PATH
  • SUNPRO_DEPENDENCIES

我们只需要将我们需要的路径加入到这些环境变量中就可以了

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
#在PATH中找到可执行文件程序的路径。
export PATH =$PATH:$HOME/bin
#gcc找到头文件的路径
C_INCLUDE_PATH=$C_INCLUDE_PATH:/usr/local/include/:/usr/local/include/zmq
export C_INCLUDE_PATH
#g++找到头文件的路径
CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH:/usr/local/include/:/usr/local/include/zmq
export CPLUS_INCLUDE_PATH
#找到动态链接库的路径
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib
export LD_LIBRARY_PATH
#找到静态库的路径
LIBRARY_PATH=$LIBRARY_PATH:/usr/local/lib
export LIBRARY_PATH

接着我们只要重新执行opam install zmq就可以顺利安装OCaml的ZeroMQ组件库了。