VS2017平臺編譯 zmq-4.2.5 過程

tiny丶發表於2019-01-21

目的

為了能夠在windows平臺使用zmq進行通訊,因此需要編譯一個可用的zmq的dll

說明

libzmq是c++語言開發的,正式版本在這裡:
https://github.com/zeromq/libzmq/releases
到這篇檔案釋出為止,正式穩定版是libzmq 4.3.1, 而本文僅適用4.2.5作為示範

zmq編譯

  1. 按照給出的連結下載zeromq-4.2.5.zip檔案。
  2. 解壓到D:\zeromq資料夾中,
  3. 用vs2017開啟工程檔案:”D:\zeromq\zeromq-4.2.5\builds\msvc\vs2015\libzmq.sln”
  4. 提示升級,選擇確定即可(工程自動升級到vs2017)
  5. 編譯,最後提示7個專案中有6個沒有成功編譯。

在gitHub上找到答案,分析visualstudio的sln檔案早期是由cmake生成的,用vs編譯不完美,路徑引用不正確。解決方案是:開啟工程資料夾下的libzmq.import.props檔案,這5個紅線處,都去掉一串“…\libzmq”,同時需要把專案名稱修改為libzmq,變成這樣:
在這裡插入圖片描述

6,儲存。重新開啟工程編譯,pass.

另外,git clone最新的開發版:
https://github.com/zeromq/libzmq
用vs2015直接編譯並沒有出現上面的問題。

開個新win32_console工程試驗一下:

  • c/c++額外的庫包含路徑新增:

  • 連結器-額外的庫包含路徑新增:

  • 連結器-輸入-依賴項新增:

  • 編譯,pass,

  • 將”D:\zeromq\zeromq-4.2.5\bin\Win32\Debug\v140\dynamic\libzmq.dll”複製到生成的exe檔案所在路徑,執行,pass!

使用範例

Server端:

#include <stdio.h>
#include <string.h>
#include <assert.h>

int main(void)
{
	//  Socket to talk to clients
	void *context = zmq_ctx_new();
	void *responder = zmq_socket(context, ZMQ_REP);
	int rc = zmq_bind(responder, "tcp://*:6666");
	assert(rc == 0);

	while (1) {
		char buffer[100000] = {'\0'};
		zmq_recv(responder, buffer, 100000, 0);
		printf("Received: %s\n", buffer);
		//sleep(1);          //  Do some 'work'
		zmq_send(responder, "World", 5, 0);
	}
	return 0;
}

client端:

#include<iostream>
#include "zmq.h"
#include <assert.h>
#include <errno.h>
#include <string.h>
#include <stdio.h>
using namespace std;

#pragma comment(lib, "libzmq.lib")  


int main(int argc, char const *argv[]) {
	void *context = zmq_ctx_new();
	void *requester = zmq_socket(context, ZMQ_REQ);
	/* 這裡連線的地址需要更換成自己要連線伺服器的地址 */
	int rc = zmq_connect(requester, "tcp://127.0.0.1:6666");
	assert(rc == 0);

	char buf[100] = { '\0' };
	FILE* fp = NULL;
	fopen_s(&fp, "1.txt", "ab+");
	if (NULL != fp)
	{
		fread(buf, 1, 100, fp);
	}
	fclose(fp);


	int a, b, c;
	zmq_version(&a, &b, &c);
	cout << "zmq-version" << a << "-" << b << "-" << c << endl;

	for (int i = 0; i < 1; i++) {
		printf("sending msg\n");
		rc = zmq_send(requester, buf, 100, 0);
		assert(rc > 0);
		/* 接受回應 */
		char buf[10];
		memset(buf, 0, 10);
		zmq_recv(requester, buf, 10, 0);
		printf("recv: %s\n", buf);
	}
	return 0;
}

相關文章