分类目录归档:zeromq

zmq-4.3.4、czmq-4.2.1、zyre-2.0.1及libsodium-1.0.18的编译

之前写过一次zmq的编译问题的文章,当时编译的是zmq-4.3.2,但是由于这次要将zmq移植到Android一体机,发生了一些奇怪的问题:一体机客户端zmq程序成功的send了数据,但是运行在云端的server毫无反应,一体机中用到的zmq是最新的4.3.4,所以决定将PC版的也升级看看问题是否还存在(4.3.2->4.3.4),本来没报太大希望的,结果将云端server的4.3.2升级到4.3.4后,Android的zmq客户端居然成功连上了,奇葩。

以下是最新4.3.4的编译过程:

1、编译libsodium-1.0.18

msvc已经配置好,直接打开解决方案:

libsodium-1.0.18\builds\msvc\vs2019\libsodium.sln

编译结果在bin目录下:

libsodium-1.0.18\bin

2、编译zeromq-4.3.4

没有现有msvc解决方案,得自己通过cmake指令生成。

  • 为避免生成带版本号的库文件,需要在CMakeLists.txt的1315行将POSTFIX的代码全部注释掉:
    set_target_properties(
      libzmq
      PROPERTIES PUBLIC_HEADER "${public_headers}"
                 #RELEASE_POSTFIX "${MSVC_TOOLSET}-mt-${ZMQ_VERSION_MAJOR}_${ZMQ_VERSION_MINOR}_${ZMQ_VERSION_PATCH}"
                 #RELWITHDEBINFO_POSTFIX "${MSVC_TOOLSET}-mt-${ZMQ_VERSION_MAJOR}_${ZMQ_VERSION_MINOR}_${ZMQ_VERSION_PATCH}"
                 #MINSIZEREL_POSTFIX "${MSVC_TOOLSET}-mt-${ZMQ_VERSION_MAJOR}_${ZMQ_VERSION_MINOR}_${ZMQ_VERSION_PATCH}"
                 #DEBUG_POSTFIX "${MSVC_TOOLSET}-mt-gd-${ZMQ_VERSION_MAJOR}_${ZMQ_VERSION_MINOR}_${ZMQ_VERSION_PATCH}"
                 RUNTIME_OUTPUT_DIRECTORY "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}"
                 COMPILE_DEFINITIONS "DLL_EXPORT"
                 OUTPUT_NAME "lib${ZMQ_OUTPUT_BASENAME}")
  • 这个版本编译静态库会有一堆错误,我们没用静态库,所以没详细研究为什么,直接把静态库编译选项关了:
option(BUILD_STATIC "Whether or not to build the static archive" OFF)
  • 由于后面用到了zyre,而zyre默认为zmq使用了sodium加密,会直接去链接zmq的相关函数,如果zmq库不使用sodium,zyre会编译出错,所以需要将sodium激活,即,制作一个FindSodium.cmake文件,内容为:
########################################################################
# CMake module for finding SODIUM
#
# The following variables will be defined:
#
#  SODIUM_FOUND
#  SODIUM_INCLUDE_DIRS
#  SODIUM_LIBRARIES
#

find_path(SODIUM_INCLUDE_DIRS
  NAMES sodium.h
  PATHS ${PROJECT_SOURCE_DIR}/../libsodium-1.0.18/src/libsodium/include
  NO_DEFAULT_PATH)
find_library(SODIUM_LIBRARIES
  NAMES libsodium
  PATHS ${PROJECT_SOURCE_DIR}/../libsodium-1.0.18/bin/x64/Release/v142/dynamic
  NO_DEFAULT_PATH)

include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(SODIUM DEFAULT_MSG SODIUM_LIBRARIES SODIUM_INCLUDE_DIRS)

一旦找到sodium,zmq会自动激活CURVE模式,将自动使用sodium加密算法。

  • 在zeromq-4.3.4目录中打开cmd,执行如下指令:
cmake -H. -Bbuild -G"Visual Studio 16 2019" -Ax64
cmake --build build --config release
cmake --build build --config debug

经过以上步骤,libzmq会顺利生成到lib及bin目录下,不会有任何编译错误。

3、编译czmq-4.2.1

  • czmq依赖libzmq,所以需要修改Findlibzmq.cmake文件,让其找到上面编译出来的libzmq:在if (NOT MSVC)加一段else就行了:
if (NOT MSVC)
    include(FindPkgConfig)
    pkg_check_modules(PC_LIBZMQ "libzmq")
    if (PC_LIBZMQ_FOUND)
        # add CFLAGS from pkg-config file, e.g. draft api.
        add_definitions(${PC_LIBZMQ_CFLAGS} ${PC_LIBZMQ_CFLAGS_OTHER})
        # some libraries install the headers is a subdirectory of the include dir
        # returned by pkg-config, so use a wildcard match to improve chances of finding
        # headers and SOs.
        set(PC_LIBZMQ_INCLUDE_HINTS ${PC_LIBZMQ_INCLUDE_DIRS} ${PC_LIBZMQ_INCLUDE_DIRS}/*)
        set(PC_LIBZMQ_LIBRARY_HINTS ${PC_LIBZMQ_LIBRARY_DIRS} ${PC_LIBZMQ_LIBRARY_DIRS}/*)
    endif(PC_LIBZMQ_FOUND)
else()
    set(PC_LIBZMQ_INCLUDE_DIRS ../zeromq-4.3.4/include)
    set(PC_LIBZMQ_LIBRARY_DIRS ../zeromq-4.3.4/build/lib/Release)
    set(PC_LIBZMQ_INCLUDE_HINTS ${PC_LIBZMQ_INCLUDE_DIRS} ${PC_LIBZMQ_INCLUDE_DIRS}/*)
    set(PC_LIBZMQ_LIBRARY_HINTS ${PC_LIBZMQ_LIBRARY_DIRS} ${PC_LIBZMQ_LIBRARY_DIRS}/*)
endif (NOT MSVC)

message("######## ${PC_LIBZMQ_INCLUDE_HINTS}")
message("######## ${PC_LIBZMQ_LIBRARY_HINTS}")
  • 由于静态库编译会有一堆错误,没有详细研究过,也不需要用静态库,所以把他关了:
option(CZMQ_BUILD_STATIC "Whether or not to build the static archive" OFF)
  • 执行指令生成配置、生成库文件:
cmake -H. -Bbuild -G"Visual Studio 16 2019" -Ax64
cmake --build build --config release
cmake --build build --config debug

4、编译zyre-2.0.1

由于zyre同时依赖zmq、czmq,所以:

  • 将czmq中的Findlibzmq.cmake拷贝直接覆盖zyre下的Findlibzmq.cmake文件;
  • 修改Findczmq.cmake,方式与修改Findlibzmq.cmake一样
    然后执行指令生成配置、生成库文件:
cmake -H. -Bbuild -G"Visual Studio 16 2019" -Ax64
cmake --build build --config release
cmake --build build --config debug

5、czmq版本号问题

在这个版本中,czmq彻底删除了msvc的配置,所以没有version.rc或resource.rc文件,我从上一个版本找到了用过的resource.rc和resource.h文件,拷贝到src目录,改一下版本号,在CMakeList.txt中加进去就可以了:

resource.h:

//{{NO_DEPENDENCIES}}
// Microsoft Visual C++ generated include file.
// Used by resource.rc

// Next default values for new objects
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE        101
#define _APS_NEXT_COMMAND_VALUE         40001
#define _APS_NEXT_CONTROL_VALUE         1001
#define _APS_NEXT_SYMED_VALUE           101
#endif
#endif

resource.rc:

// Microsoft Visual C++ generated resource script.
//
#include "resource.h"

#define APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 2 resource.
//
#include "winres.h"

/////////////////////////////////////////////////////////////////////////////
#undef APSTUDIO_READONLY_SYMBOLS

/////////////////////////////////////////////////////////////////////////////
// English (United States) resources

#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US

#ifdef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// TEXTINCLUDE
//

1 TEXTINCLUDE
BEGIN
    "resource.h\0"
END

2 TEXTINCLUDE
BEGIN
    "#include ""winres.h""\r\n"
    "\0"
END

3 TEXTINCLUDE
BEGIN
    "\r\n"
    "\0"
END

#endif    // APSTUDIO_INVOKED

/////////////////////////////////////////////////////////////////////////////
//
// Version
//

VS_VERSION_INFO VERSIONINFO
 FILEVERSION 4,2,1,0
 PRODUCTVERSION 4,2,1,0
 FILEFLAGSMASK 0x3fL
#ifdef _DEBUG
 FILEFLAGS 0x1L
#else
 FILEFLAGS 0x0L
#endif
 FILEOS 0x40004L
 FILETYPE 0x7L
 FILESUBTYPE 0x0L
BEGIN
    BLOCK "StringFileInfo"
    BEGIN
        BLOCK "040904b0"
        BEGIN
            VALUE "CompanyName", "The AUTHORS"
            VALUE "FileDescription", "The high-level C binding for 0MQ"
            VALUE "FileVersion", "4.2.1.0"
            VALUE "InternalName", "CZMQ"
            VALUE "LegalCopyright", "Copyright (c) the Authors"
            VALUE "OriginalFilename", "libczmq.dll"
            VALUE "ProductName", "CZMQ"
            VALUE "ProductVersion", "4.2.1.0"
        END
    END
    BLOCK "VarFileInfo"
    BEGIN
        VALUE "Translation", 0x409, 1200
    END
END

#endif    // English (United States) resources
/////////////////////////////////////////////////////////////////////////////

#ifndef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 3 resource.
//

/////////////////////////////////////////////////////////////////////////////
#endif    // not APSTUDIO_INVOKED

CMakeList.txt第415行,添加对rc文件的引用

      add_library(czmq SHARED ${czmq_sources} ${CMAKE_CURRENT_SOURCE_DIR}/src/resource.rc)