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