【Qt 学习之路】使用 cmake 在Windows上 编译 ZeroMQ

文章目录

  • 1、概述
  • 2、编译
    • 2.1、用 Visual Studio 的解决方案方式
      • 2.1.1、找到 Builds 文件夹
      • 2.1.2、查看 deprecated-msvc 下的 libzmq.sln 文件
      • 2.1.3、使用 Visual Studio 打开 libzmq.sln 解决方案
      • 2.1.4、修改 libzmq.import.props 文件
      • 2.1.5、编译生成
    • 2.2、用 C++ 的cmake方式
      • 2.2.1、准备好编译环境
        • 2.2.1.1、准备编译环境
        • 2.2.1.2、编译一个纯C++程序
        • 2.2.1.3、查看编译结果,确保Cmake可用
      • 2.2.2、打开ZeroMQ的CMakeLists.txt文件
      • 2.2.3、编译ZeroMQ
  • 3、编译后处理
    • 3.1、找到重点三类文件
    • 3.2、文件分类保留处理

1、概述

前几篇文章讲述了ZeroMQ是什么、网络通信,和如何在Qt上使用现成的ZeroMQ的库,本篇文章中主要讲述如何使用 cmake在 Windows上编译ZeroMQ。下载和安装这里不讲了,在之前的文章中讲述的已经很详细了,想了解的可以看以下相关资料。

相关资料:
1、【Qt 学习之路】在 Qt 使用 ZeroMQ:链接地址
2、【网络编程】ZeroMQ的网络通信:链接地址

2、编译

2.1、用 Visual Studio 的解决方案方式

2.1.1、找到 Builds 文件夹

在 ZeroMQ 的 builds 文件夹下,有很多种编译方法,为了方便演示,本文选择msvc进行演示。
在这里插入图片描述

2.1.2、查看 deprecated-msvc 下的 libzmq.sln 文件

在这里插入图片描述

2.1.3、使用 Visual Studio 打开 libzmq.sln 解决方案

在这里插入图片描述

2.1.4、修改 libzmq.import.props 文件

用 Notepad++ 打开 libzmq.import.props 文件,修改 5处 路径,全部改成…\bin【注意:去掉“…\libzmq\”】

  • 原:
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"><PropertyGroup Label="Globals"><_PropertySheetDisplayName>ZMQ Import Settings</_PropertySheetDisplayName></PropertyGroup><!-- User Interface --><ItemGroup Label="BuildOptionsExtension"><PropertyPageSchema Include="$(MSBuildThisFileDirectory)libzmq.import.xml" /></ItemGroup><!-- Configuration --><ItemDefinitionGroup><ClCompile><PreprocessorDefinitions Condition="'$(Option-sodium)' == 'true'">ZMQ_USE_LIBSODIUM;%(PreprocessorDefinitions)</PreprocessorDefinitions><PreprocessorDefinitions Condition="'$(Option-openpgm)' == 'true'">ZMQ_HAVE_OPENPGM;%(PreprocessorDefinitions)</PreprocessorDefinitions><PreprocessorDefinitions Condition="'$(Option-gssapi)' == 'true'">HAVE_LIBGSSAPI_KRB5;%(PreprocessorDefinitions)</PreprocessorDefinitions><PreprocessorDefinitions Condition="'$(Option-draftapi)' == 'true'">ZMQ_BUILD_DRAFT_API;%(PreprocessorDefinitions)</PreprocessorDefinitions></ClCompile></ItemDefinitionGroup><!-- Linkage --><ItemDefinitionGroup><ClCompile><AdditionalIncludeDirectories>$(ProjectDir)..\..\..\..\..\libzmq\include\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories><PreprocessorDefinitions Condition="'$(Linkage-libzmq)' == 'static' Or '$(Linkage-libzmq)' == 'ltcg'">ZMQ_STATIC;%(PreprocessorDefinitions)</PreprocessorDefinitions></ClCompile><Link><AdditionalDependencies Condition="'$(Linkage-libzmq)' != ''">libzmq.lib;%(AdditionalDependencies)</AdditionalDependencies><AdditionalLibraryDirectories Condition="$(Configuration.IndexOf('Debug')) != -1">$(ProjectDir)..\..\..\..\..\libzmq\bin\$(PlatformName)\Debug\$(PlatformToolset)\$(Linkage-libzmq)\;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories><AdditionalLibraryDirectories Condition="$(Configuration.IndexOf('Release')) != -1">$(ProjectDir)..\..\..\..\..\libzmq\bin\$(PlatformName)\Release\$(PlatformToolset)\$(Linkage-libzmq)\;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories></Link></ItemDefinitionGroup><!-- Copy --><Target Name="Linkage-libzmq-dynamic" AfterTargets="AfterBuild" Condition="'$(Linkage-libzmq)' == 'dynamic'"><Copy Condition="$(Configuration.IndexOf('Debug')) != -1"SourceFiles="$(ProjectDir)..\..\..\..\..\libzmq\bin\$(PlatformName)\Debug\$(PlatformToolset)\dynamic\libzmq.dll"DestinationFiles="$(TargetDir)libzmq.dll"SkipUnchangedFiles="true" /><Copy Condition="$(Configuration.IndexOf('Debug')) != -1"SourceFiles="$(ProjectDir)..\..\..\..\..\libzmq\bin\$(PlatformName)\Debug\$(PlatformToolset)\dynamic\libzmq.pdb"DestinationFiles="$(TargetDir)libzmq.pdb"SkipUnchangedFiles="true" /><Copy Condition="$(Configuration.IndexOf('Release')) != -1"SourceFiles="$(ProjectDir)..\..\..\..\..\libzmq\bin\$(PlatformName)\Release\$(PlatformToolset)\dynamic\libzmq.dll"DestinationFiles="$(TargetDir)libzmq.dll"SkipUnchangedFiles="true" /></Target><!-- Messages --><Target Name="libzmq-info" BeforeTargets="AfterBuild" Condition="'$(Linkage-libzmq)' == 'dynamic'"><Message Text="Copying libzmq.dll -&gt; $(TargetDir)libzmq.dll" Importance="high"/><Message Text="Copying libzmq.pdb -&gt; $(TargetDir)libzmq.pdb" Importance="high" Condition="$(Configuration.IndexOf('Debug')) != -1" /></Target></Project>
  • 改:
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"><PropertyGroup Label="Globals"><_PropertySheetDisplayName>ZMQ Import Settings</_PropertySheetDisplayName></PropertyGroup><!-- User Interface --><ItemGroup Label="BuildOptionsExtension"><PropertyPageSchema Include="$(MSBuildThisFileDirectory)libzmq.import.xml" /></ItemGroup><!-- Configuration --><ItemDefinitionGroup><ClCompile><PreprocessorDefinitions Condition="'$(Option-sodium)' == 'true'">ZMQ_USE_LIBSODIUM;%(PreprocessorDefinitions)</PreprocessorDefinitions><PreprocessorDefinitions Condition="'$(Option-openpgm)' == 'true'">ZMQ_HAVE_OPENPGM;%(PreprocessorDefinitions)</PreprocessorDefinitions><PreprocessorDefinitions Condition="'$(Option-gssapi)' == 'true'">HAVE_LIBGSSAPI_KRB5;%(PreprocessorDefinitions)</PreprocessorDefinitions><PreprocessorDefinitions Condition="'$(Option-draftapi)' == 'true'">ZMQ_BUILD_DRAFT_API;%(PreprocessorDefinitions)</PreprocessorDefinitions></ClCompile></ItemDefinitionGroup><!-- Linkage --><ItemDefinitionGroup><ClCompile><AdditionalIncludeDirectories>$(ProjectDir)..\..\..\..\..\libzmq\include\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories><PreprocessorDefinitions Condition="'$(Linkage-libzmq)' == 'static' Or '$(Linkage-libzmq)' == 'ltcg'">ZMQ_STATIC;%(PreprocessorDefinitions)</PreprocessorDefinitions></ClCompile><Link><AdditionalDependencies Condition="'$(Linkage-libzmq)' != ''">libzmq.lib;%(AdditionalDependencies)</AdditionalDependencies><AdditionalLibraryDirectories Condition="$(Configuration.IndexOf('Debug')) != -1">$(ProjectDir)..\..\..\..\bin\$(PlatformName)\Debug\$(PlatformToolset)\$(Linkage-libzmq)\;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories><AdditionalLibraryDirectories Condition="$(Configuration.IndexOf('Release')) != -1">$(ProjectDir)..\..\..\..\bin\$(PlatformName)\Release\$(PlatformToolset)\$(Linkage-libzmq)\;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories></Link></ItemDefinitionGroup><!-- Copy --><Target Name="Linkage-libzmq-dynamic" AfterTargets="AfterBuild" Condition="'$(Linkage-libzmq)' == 'dynamic'"><Copy Condition="$(Configuration.IndexOf('Debug')) != -1"SourceFiles="$(ProjectDir)..\..\..\..\bin\$(PlatformName)\Debug\$(PlatformToolset)\dynamic\libzmq.dll"DestinationFiles="$(TargetDir)libzmq.dll"SkipUnchangedFiles="true" /><Copy Condition="$(Configuration.IndexOf('Debug')) != -1"SourceFiles="$(ProjectDir)..\..\..\..\bin\$(PlatformName)\Debug\$(PlatformToolset)\dynamic\libzmq.pdb"DestinationFiles="$(TargetDir)libzmq.pdb"SkipUnchangedFiles="true" /><Copy Condition="$(Configuration.IndexOf('Release')) != -1"SourceFiles="$(ProjectDir)..\..\..\..\bin\$(PlatformName)\Release\$(PlatformToolset)\dynamic\libzmq.dll"DestinationFiles="$(TargetDir)libzmq.dll"SkipUnchangedFiles="true" /></Target><!-- Messages --><Target Name="libzmq-info" BeforeTargets="AfterBuild" Condition="'$(Linkage-libzmq)' == 'dynamic'"><Message Text="Copying libzmq.dll -&gt; $(TargetDir)libzmq.dll" Importance="high"/><Message Text="Copying libzmq.pdb -&gt; $(TargetDir)libzmq.pdb" Importance="high" Condition="$(Configuration.IndexOf('Debug')) != -1" /></Target></Project>

2.1.5、编译生成

按照官网的方式,这一步应该是成功了,但是目前是失败,还少文件,可能是官方下载的包有问题
在这里插入图片描述

2.2、用 C++ 的cmake方式

2.2.1、准备好编译环境

上面用 VS 既然不行,这里就不用VS,用Qt或者直接用cmake来尝试cmake编译。

2.2.1.1、准备编译环境

这里用的是Qt的Creator来编译,准备好cmake
在这里插入图片描述

2.2.1.2、编译一个纯C++程序

编译一个纯C++程序,选择cmake,然后编译运行,查看编译环境是否成功
在这里插入图片描述

2.2.1.3、查看编译结果,确保Cmake可用

直接用MinGW来编译,查看结果
在这里插入图片描述

2.2.2、打开ZeroMQ的CMakeLists.txt文件

在ZeroMQ的主目录,找到CMakeLists.txt文件,然后用Qt Creator打开
在这里插入图片描述

2.2.3、编译ZeroMQ

编译完ZeroMQ就可以直接看编译成功
在这里插入图片描述

3、编译后处理

3.1、找到重点三类文件

重点是以下几个文件,找到就可以自己使用了

  • 1、include文件夹下的.h文件
    在这里插入图片描述
  • 2、.lib库
    在这里插入图片描述
  • 3、.dll库
    在这里插入图片描述

3.2、文件分类保留处理

因为这个是Debug模式下编译的,所以我们可以自己建立一份Debug模式的文件夹。很多不同的第三方库,Debug和Release文件编译出的结果大部分是不同的,所以在调用时一般也会区分库的处理,这里我们做分类保留处理即可。

如何调用库我就不在赘述了,之前的文章中讲述过了,可以查看文章开头 第 1 章概述中的相关资料查看。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/496527.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言中如何进行内存管理

主页&#xff1a;17_Kevin-CSDN博客 收录专栏&#xff1a;《C语言》 C语言是一种强大而灵活的编程语言&#xff0c;但与其他高级语言不同&#xff0c;它要求程序员自己负责内存的管理。正确的内存管理对于程序的性能和稳定性至关重要。 一、引言 C 语言是一门广泛使用的编程语…

Twing模板注入 [BJDCTF2020]Cookie is so stable1

打开题目 我们先抓包分析一下 可以输入{{7*7}}处发包试一下 可以看到在cookie处存在ssti模板注入 输入{{7*‘7’}}&#xff0c;返回49表示是 Twig 模块 输入{{7*‘7’}}&#xff0c;返回7777777表示是 Jinja2 模块 在这里可以看出是Twing模块 我们直接用固定payload就可以…

搬家了,发现虚拟机链接不上,查找原因,解决了

是网络配置的问题&#xff0c;因为ip地址变动&#xff0c;所以配置文件要进行改动 1.通过cmd查看本地主机ip地址 2.在虚拟网络编辑器中选在vmnet8&#xff0c;用管理员权限修改ip&#xff0c;网关&#xff0c;子网掩码&#xff0c;和物理主机对应 3.在/etc/sysconfig/network…

JavaEE:多线程(3):案例代码

多线程基础知识要点 案例一&#xff1a;单例模式 是一种设计模式 软件设计需要框架&#xff0c;这是硬性的规定&#xff1b;设计模式是软性的规定。遵循好设计模式&#xff0c;代码的下限就被兜住了 单例 单个实例&#xff08;对象&#xff09; 某个类在一个进程中只应该创…

GIS之深度学习02:Anaconda2019版本安装(py38)

Anaconda是一个专注于数据科学和机器学习的开源发行版&#xff0c;内置了丰富的工具和库&#xff0c;包括Python解释器、NumPy、SciPy、Pandas、Scikit-learn、TensorFlow等&#xff0c;使用户能够轻松进行科学计算和数据分析。其强大的包管理器conda简化了软件包的安装和环境管…

redis-Redis主从,哨兵和集群模式

一&#xff0c;Redis的主从复制 ​ 主机数据更新后根据配置和策略&#xff0c; 自动同步到备机的master/slaver机制&#xff0c;Master以写为主&#xff0c;Slave以读为主。这样做的好处是读写分离&#xff0c;性能扩展&#xff0c;容灾快速恢复。 1.1 环境搭建 如果你的redi…

图论-算法题

797. 所有可能的路径 题目: 给你一个有 n 个节点的 有向无环图&#xff08;DAG&#xff09;&#xff0c;请你找出所有从节点 0 到节点 n-1 的路径并输出&#xff08;不要求按特定顺序&#xff09; graph[i] 是一个从节点 i 可以访问的所有节点的列表&#xff08;即从节点 i …

Java面向对象之接口和抽象类的区别一目了然

介绍 相信对于Java面向对象部分&#xff0c;很多人很长一段时间对于接口和抽象类的区别&#xff0c;使用场景都不是很熟悉&#xff0c;同是作为抽象层重要的对象&#xff0c;工作中到底什么情况下使用抽象类&#xff0c;不是很清楚。本文就一次性把这些概念一次性说清楚&#x…

K线实战分析系列之八:十字星——容易识别的特殊形态

K线实战分析系列之八&#xff1a;十字星——容易识别的特殊形态 一、十字启明星和十字黄昏星二、弃婴底部形态和弃婴顶部形态三、总结十字启明星和十字黄昏星形态的要点 一、十字启明星和十字黄昏星 当开盘价与收盘价极为接近的时候&#xff0c;当期的K线就呈现为一根十字线&am…

微服务Springcloud智慧工地APP源码 AI人工智能识别 支持多工地使用

目录 一、现状描述 二、行业难点 APP端功能 一、项目人员 二、视频监控 三、危大工程 四、绿色施工 五、安全隐患 AI智能识别 环境监测 实名制管理 智慧监测 智慧工地全套解决方案 一、现状描述 建筑工程建设具有明显的生产规模大宗性与生产场所固定性的特点。建…

【C++练级之路】【Lv.9】【STL】stack类和queue类的模拟实现

快乐的流畅&#xff1a;个人主页 个人专栏&#xff1a;《C语言》《数据结构世界》《进击的C》 远方有一堆篝火&#xff0c;在为久候之人燃烧&#xff01; 文章目录 一、容器适配器二、stack2.1 push2.2 pop2.3 top2.4 size2.5 empty 三、queue3.1 push3.2 pop3.3 front3.4 back…

Flutter中高级JSON处理:使用json_serializable进行深入定制

Flutter中高级JSON处理 使用json_serializable库进行深入定制 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at: https://jclee95.blog.csdn.netEmail: 291148484163.com. Shenzhen ChinaAddress of this article:https://blog.csdn.net/qq_28550263/article/details/1363…