项目需求
go语言开发需要使用ZMQ时通常会去使https://github.com/pebbe/zmq4这个库,但是zmq4这个库在linux下是通过pkg-config去找zmq的编译文件的。在某些情况下我们不希望通过pkg-config去找zmq的编译文件,不希望去通过命令安装zmq就可以直接使用,就可以去修改zmq4这个库来达道无需安装zmq就能使用的目的。
解决办法
1.zmq源码编译
编译zmq源码,编译zmq源码可以参考其他博主文章或者问chatGPT,为了方便可以直接通过zmq官网推荐的命令将zmq下载下来再将包和头文件复制出来
2.修改zmq4库
首先看到zmq4/zmq4.go中,在声明中这里不是windows都会通过pkg-config去找libzmq.pc基本上也就是去安装的默认路径下找(注意这个文件夹的名字不能是zmq),我们可以修改这个声明
#cgo !windows pkg-config: libzmq
#include <zmq.h>
#if ZMQ_VERSION_MINOR < 2
#include <zmq_utils.h>
#endif
#include <stdlib.h>
#include <string.h>
#include "zmq4.h"
我这里将编译好的zmq文件和头文件放到了zmq4目录下的zmqlib的lib和include目录下,可根据自己需要修改
#cgo linux CFLAGS: -I./zmqlib/include -DZMQ_BUILD_DRAFT_API=1
#cgo linux LDFLAGS: -L./zmqlib/lib -lzmq
#include <zmq.h>
#if ZMQ_VERSION_MINOR < 2
#include <zmq_utils.h>
#endif
#include <stdlib.h>
#include <string.h>
#include "zmq4.h"
再来就是修改zmq4/draft/zmq4.go文件,与上面同理
#cgo !windows pkg-config: libzmq
#cgo windows CFLAGS: -I/usr/local/include -DZMQ_BUILD_DRAFT_API=1
#cgo windows LDFLAGS: -L/usr/local/lib -lzmq
#include <zmq.h>
#if ZMQ_VERSION_MINOR < 2
#include <zmq_utils.h>
#endif
#include <stdlib.h>
#include <string.h>
#include "zmq4.h"
#include "zmq42draft.h"
去掉 !windows这行
#cgo linux CFLAGS: -I../zmqlib/include -DZMQ_BUILD_DRAFT_API=1
#cgo linux LDFLAGS: -L../zmqlib/lib -lzmq
#cgo windows CFLAGS: -I/usr/local/include -
#include <zmq.h>
#if ZMQ_VERSION_MINOR < 2
#include <zmq_utils.h>
#endif
#include <stdlib.h>
#include <string.h>
#include "zmq4.h"
#include "zmq42draft.h"
注意将原有包名都修改掉,这样zmq4库就修改好了,就可以引入到自己的项目中了。
3.引入项目
可以将项目修改后的zmq4放在gitee或者github上来通过go get 命令映入到自己的项目中去。在引入到项目中后如使用goland进行开发需要进行一些配置,在修改完zmq4库找包的路径后还会去动态链接一些库,默认是在/lib/x86_64-linux-gnu这个目录下去找的,这个目录似乎在通过命令安装zmq时会将部分文件安装到这个目录下。我们可以将这些包跟程序放到一起或放在指定目录下。要找到这些包就需要在启动和打包时添加一些命令,先来讲在goland中的配置。在goland中需要在环境变量中进行一些配置,名称为LD_LIBRARY_PATH,值为你存放这些包的路径可以是相对路径,我这里将这些包放在了/root/program/libzmq/lib目录下。
通过命令行就行启动或者打包命令如下(可以是相对路径将文件):
go run -ldflags="-L/root/program/libzmq/lib" main.go
go build -ldflags="-L/root/program/libzmq/lib" main.go
如不成功可以先设置环境变量后再试
export LD_LIBRARY_PATH=/root/program/libzmq/lib:$LD_ LD_LIBRARY_PATH
ldconfig
可以通过 ldd命令来查看是否缺少某些动态依赖文件
ldd main
最后,受于自身水平限制且接触时间不是很长所以可能有些问题,但大致解决思路就是这里,去掉原有zmq4中的pkg-config配置,替换为自己期望的路径,再动态链接到指定库。