win10下编译使用zmq


info

  • virtual studio 2015
  • cmake-3.22.1
  • libzmq-4.3.4

1 vs2015运行多个main函数文件

该类问题的解决方法,网上又很多,基本上就是

  • 创建一个解决方案,一般解决方案里面都会自带一个项目,改项目里面可以创建一个含main函数的文件
  • 在解决方案下面新增项目,新增的项目中也可以有一个含main函数的文件
  • 需要执行时,以解决方案(重新)生成
  • 再到各项目中执行运行操作

2 基于vs2015编译zmq

  • 其中cmake的安装比较简单,请参考其他同学在网上的分享,使用cmake编译时,一旦有红色出现,都表示有err发生,下面的编译会出各种错,所以在编译前需确保,cmake的“configure”后没有红色条目出现

  • 下载libzmq

    • https://codeload.github.com/zeromq/libzmq/zip/refs/tags/v4.3.4
  • 解压到:D:\ProgramFiles\vsLibzmq\libzmq-4.3.4(可自定义)

  • 创建输出目录,libzmq-4.3.4\builds\output

    • 话说里面也有msvc目录,里面有各版本virtual studio版本,但是直接使用会有很多报错,这里不采用
  • 使用cmake重新生成面向vs2015的系列文件

    • 在这里插入图片描述在这里插入图片描述
  • Finish按钮后,cmake编译后会有很多红色,看log有如下几项

    • The package name passed to `find_package_handle_standard_args` (sodium)
    • Sodium是一个加密库,主要用于加密、解密、签名和生成密码哈希等,一般不需要,可在cmake中勾选掉
    • xxx Warning at tests/CMakeLists.txt: xxx
    • 这些是zmq测试程序中报的问题,目录,libzmq-4.3.4\tests,而这个目录在编译时不使用,其error信息可以不用care
  • 去掉勾选在这里插入图片描述

  • 再重新按上图中标识③的按钮“configure”,之后就没有一片红了,接着按按钮“Generate”,会显示Generating done

  • 在这里插入图片描述

  • 这时候可以关闭cmake,使用vs2015打开libzmq-4.3.4\builds\output下的ZeroMQ.sln文件,使用vs2015加载项目时,有较慢,需耐心等待

  • 在这里插入图片描述

  • 图示的4个标识

    1. 选择debug,还是release,可以先编debug、再去编release,也可以直接编译release
      • Debug 调试版本
      • Release 正式版本
      • RelWithDebInfo 带调试信息的release版本
      • MinSizeRel 最小的release版本
    2. 选择在哪个平台编译,x64 or x32,我们在cmake时面向的就是x64,这里选择x64
    3. 右键选中libzmq,选择生成,即进行编译生成动态库,这之间就不会有err发生,会直接编译成功
    4. 右键选中libzmq-static,选择生成,即进行编译生成静态库
  • 生成的文件如下

    • libzmq-4.3.4\builds\output\bin
    • libzmq-4.3.4\builds\output\lib
  • 把它们copy出来,可以把debug跟release的文件混在一起

    • 在这里插入图片描述
    • gd - 表示是debug版本
    • s - 表示是static版本
  • D:\ProgramFiles\libzmq-4.3.4\bin添加环境变量到path中,并重启系统

3 示例

注意,本次编译的是c语言库,也可用于c++语言中。

  • 使用vs2015创建解决方案
  • 新建client项目,client.c 如下
//client
#include <zmq.h>
#include <stdio.h>
#include <string.h>
#include <assert.h>
#include <windows.h> //使用win环境下Sleep函数,单位毫秒

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://*:5555");
	assert(rc == 0);

	while (1) {
    
    
		char buffer[10];
		zmq_recv(responder, buffer, 10, 0);
		printf("Received Hello\n");
		zmq_send(responder, "World", 5, 0);
		Sleep(1000); //1000毫秒
	}
	return 0;
}
  • 新建server项目,server.c 如下
//server
#include <zmq.h>
#include <string.h>
#include <stdio.h>

int main(void)
{
    
    
	printf("Connecting to hello world server…\n");
	void *context = zmq_ctx_new();
	void *requester = zmq_socket(context, ZMQ_REQ);
	zmq_connect(requester, "tcp://localhost:5555");

	int request_nbr;
	for (request_nbr = 0; ; request_nbr++) {
    
    
		char buffer[10];
		printf("Sending Hello %d…\n", request_nbr);
		zmq_send(requester, "Hello", 5, 0);
		zmq_recv(requester, buffer, 10, 0);
		printf("Received World %d\n", request_nbr);
	}
	zmq_close(requester);
	zmq_ctx_destroy(context);
	return 0;
}
  • 配置client、server项目,以启用libzmq
    • 右键client,server项目,属性(二者配置方法一样,不再赘述)
    • VC++目录-》可执行文件目录(上一步配过bin目录,这一步可不配)
    • VC++目录-》包含目录-》(include所在位置)D:\ProgramFiles\libzmq-4.3.4\include
    • VC++目录-》库目录-》D:\ProgramFiles\libzmq-4.3.4\lib
    • 链接器-》输入-》附加依赖项-》输入libzmq-v120-mt-4_0_4.lib
  • Note:配置时记得要选择x64,配置好后,运行结果如下
  • 在这里插入图片描述

4 zmq on QT

  • 使用QT创建 Non-Qt Project,选择c Application
  • 创建名为server.c文件,输入内容如下
//client
#include <zmq.h>
#include <stdio.h>
#include <string.h>
#include <assert.h>
#include <unistd.h>
#include <pthread.h>

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

    while (1) {
    
    
        char buffer[10];
        zmq_recv(responder, buffer, 10, 0);
        printf("----------------- client: Received Hello\n");
        zmq_send(responder, "World", 5, 0);
        sleep(1);
    }
    return 0;
}


int server(void)
{
    
    
    printf("[server] Connecting to hello world server\n");
    void *context = zmq_ctx_new();
    void *requester = zmq_socket(context, ZMQ_REQ);
    zmq_connect(requester, "tcp://localhost:5555");

    int request_nbr;
    for (request_nbr = 0; ; request_nbr++) {
    
    
        char buffer[10];
        printf("[server] Sending Hello %d\n", request_nbr);
        zmq_send(requester, "Hello", 5, 0);
        zmq_recv(requester, buffer, 10, 0);
        printf("[server] Received World %d\n", request_nbr);
    }
    zmq_close(requester);
    zmq_ctx_destroy(context);
    return 0;
}

int main(void)
{
    
    
    pthread_t thid;
    pthread_create(&thid, NULL, (void *)client, NULL);
    server();
    return 0;
}

  • 在项目名上右键 -》添加库 -》外部库 -》

    • 库文件,选择动态库libzmq-v140-mt-4_3_4.lib路径,D:\ProgramFiles\libzmq-4.3.4\lib
    • 包含路径,选择,D:\ProgramFiles\libzmq-4.3.4\include
    • 会自动在xxx.pro 文件中生成如下内容
    • 在这里插入图片描述
  • 右键项目名,选构建,并执行

–end

猜你喜欢

转载自blog.csdn.net/tianzong2019/article/details/122722772