使用 CMake 配置 czmq、zmq 和钠

问题描述

我在使用 CMake 配置/构建 czmq 时遇到问题。这是“extlibs”下三个库的源代码的当前项目结构:

root
  |--CMakeLists.txt
  |--src
  |--include
  |--extlibs
  |   |--CMakeLists.txt
  |   |--sodium
  |   |--zmq
  |   |--czmq

根 CMakeLists.txt:

cmake_minimum_required (VERSION 3.15)
set(project czmq_build_project)
set(project_root ${CMAKE_CURRENT_SOURCE_DIR})
set(extlibs ${project_root}/extlibs)
set(msbuild "C:/Program Files (x86)/Microsoft Visual Studio/2019/Enterprise/MSBuild/Current/Bin/MSBuild.exe")
set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_required on)
set(project_cfg Release)
project(${project} CXX)


# Add source
add_executable (${project} "src/main.cpp" "include/class.hpp")

# Directories to search for headers -----------
include_directories(${extlibs})
include_directories(${project_root}/include)

# Add 3rd Party Libraries
add_subdirectory(${extlibs})

还有“extlibs/CMakeLists.txt”

# ----------------------------------------------
#           Third Party Libraries
# Note: All libraries are being built under a
# static release config for x64 (at the moment)
# ----------------------------------------------
# czmq requires libzmq. Additionaly,libsodium is 
# used for the curve encryption library for libzmq. 
# Therefore,we build: libsodium->libzmq->czmq.
# ----------------------------------------------

include(ExternalProject)
set(lib_out "${CMAKE_BINARY_DIR}/extlibs")

add_custom_target(buildsodium ALL)

# Configure libsodium -------------------------
function(build_libsodium)
    set(sodium_root "${extlibs}/sodium")
    set(sodium_sln "${sodium_root}/builds/msvc/vs2019/libsodium.sln")
    set(sodium_bin "${sodium_root}/bin")
    set(sodium_lib "${sodium_root}/bin/x64/${project_cfg}/v142/static/libsodium.lib")
    set(sodium_out "${lib_out}/sodium/libsodium.lib")
    set(sodium_bldcmd ${msbuild} -m -t:Build -p:configuration=Static${project_cfg} -p:platform=x64 ${sodium_sln})
    ExternalProject_Add(libsodium
      SOURCE_DIR        "${sodium_root}"
      CONfigURE_COMMAND ""
      BUILD_COMMAND     ${sodium_bldcmd}
      INSTALL_COMMAND ""
      ALWAYS TRUE
    )
    add_custom_command(TARGET libsodium POST_BUILD
        BYPRODUCTS ${sodium_out}
        COMMAND echo "copying libsodium.lib to ${sodium_out}"
        COMMAND ${CMAKE_COMMAND} -E copy ${sodium_lib} ${sodium_out}
        COMMAND echo "Removing ${sodium_bin}"
        COMMAND ${CMAKE_COMMAND} -E remove_directory ${sodium_bin}
    )
    add_dependencies(buildsodium libsodium)
endfunction()

add_custom_target(buildzmq ALL)

# Configure libzmq ----------------------------
function(build_libzmq)
    set(ENABLE_CURVE OFF )
    set(WITH_LIBsodium_STATIC ON)
    set(ENABLE_CPACK OFF)
    set(BUILD_SHARED OFF)
    set(BUILD_STATIC ON)
    set(BUILD_TESTS OFF)
    set(CMAKE_INCLUDE_PATH ${extlibs}/sodium/src/libsodium/include)
    set(CMAKE_LIBRARY_PATH ${lib_out}/sodium)
    set(CMAKE_CXX_FLAGS_RELEASE "/MT /O2 /Ob2 /DNDEBUG")
    set(CMAKE_CXX_FLAGS_DEBUG "/MTd /Zi /Ob0 /Od /RTC1")
    set(CMAKE_INSTALL_PREFIX ${lib_out}/zmq)
    add_subdirectory(zmq)
    add_dependencies(buildzmq buildsodium)
endfunction()

add_custom_target(buildczmq ALL)

# Configure czmq ------------------------------
function(build_libczmq)
    set(ZeroMQ_DIR ${lib_out}/zmq/lib)
    set(CZMQ_BUILD_SHARED OFF)
    set(CZMQ_BUILD_STATIC ON)
    set(BUILD_TESTING OFF)
    set(CMAKE_PREFIX_PATH ${lib_out}/zmq)
    set(LIBZMQ_INCLUDE_Dirs ${extlibs}/zmq/include)
    set(LIBZMQ_LIBRARIES ${lib_out}/zmq/lib)
    set(CMAKE_CXX_FLAGS_RELEASE "-DZMQ_STATIC /MT /O2 /Ob2 /DNDEBUG")
    set(CMAKE_CXX_FLAGS_DEBUG "-DZMQ_STATIC /MTd /Zi /Ob0 /Od /RTC1")
    set(CMAKE_CONfigURATION_TYPES "Debug;Release")
    set(CMAKE_INSTALL_PREFIX ${lib_out}/czmq)
    add_subdirectory(czmq)
    add_dependencies(buildczmq buildzmq)
endfunction()


build_libsodium()
build_libzmq()
build_libczmq()

CMake 输出

 CMake generation started for configuration: 'x64'.
1> Working directory: ...<root>\build\x64
1> [CMake] -- Detected ZMQ Version - 4.3.4
1> [CMake] -- Could NOT find PkgConfig (missing: PKG_CONfig_EXECUTABLE) 
1> [CMake] -- Not building draft classes and methods
1> [CMake] -- Using builtin sha1
1> [CMake] -- CURVE security is disabled
1> [CMake] -- Detected _WIN32_WINNT from CMAKE_SYstem_VERSION: 0x0A00
1> [CMake] -- Using polling method in I/O threads: epoll
1> [CMake] -- Including wepoll
1> [CMake] -- Using polling method in zmq_poll(er)_* API: poll
1> [CMake] -- Using 64 bytes alignment for lock-free data structures
1> [CMake] -- Using condition_variable_t implementation: stl11
1> [CMake] -- Checking whether noexcept is supported
1> [CMake] -- Could NOT find asciidoc (missing: asciidoc_EXECUTABLE) 
1> [CMake] CMake Deprecation Warning at extlibs/zmq/tests/CMakeLists.txt:2 (cmake_minimum_required):
1> [CMake]   Compatibility with CMake < 2.8.12 will be removed from a future version of
1> [CMake]   CMake.
1> [CMake] 
1> [CMake]   Update the VERSION argument <min> value or use a ...<max> suffix to tell
1> [CMake]   CMake that the project does not need compatibility with older versions.
1> [CMake] 
1> [CMake] 
1> [CMake] CMake Warning (dev) at extlibs/zmq/tests/CMakeLists.txt:306 (message):
1> [CMake]   Test 'test_bind_stream_fuzzer' is not kNown to CTest.
1> [CMake] This warning is for project developers.  Use -Wno-dev to suppress it.
1> [CMake] 
1> [CMake] CMake Warning (dev) at extlibs/zmq/tests/CMakeLists.txt:306 (message):
1> [CMake]   Test 'test_bind_ws_fuzzer' is not kNown to CTest.
1> [CMake] This warning is for project developers.  Use -Wno-dev to suppress it.
1> [CMake] 
1> [CMake] CMake Warning (dev) at extlibs/zmq/tests/CMakeLists.txt:306 (message):
1> [CMake]   Test 'test_connect_stream_fuzzer' is not kNown to CTest.
1> [CMake] This warning is for project developers.  Use -Wno-dev to suppress it.
1> [CMake] 
1> [CMake] CMake Warning (dev) at extlibs/zmq/tests/CMakeLists.txt:306 (message):
1> [CMake]   Test 'test_connect_ws_fuzzer' is not kNown to CTest.
1> [CMake] This warning is for project developers.  Use -Wno-dev to suppress it.
1> [CMake] 
1> [CMake] CMake Warning (dev) at extlibs/zmq/tests/CMakeLists.txt:306 (message):
1> [CMake]   Test 'test_socket_options_fuzzer' is not kNown to CTest.
1> [CMake] This warning is for project developers.  Use -Wno-dev to suppress it.
1> [CMake] 
1> [CMake] CMake Deprecation Warning at extlibs/zmq/unittests/CMakeLists.txt:2 (cmake_minimum_required):
1> [CMake]   Compatibility with CMake < 2.8.12 will be removed from a future version of
1> [CMake]   CMake.
1> [CMake] 
1> [CMake]   Update the VERSION argument <min> value or use a ...<max> suffix to tell
1> [CMake]   CMake that the project does not need compatibility with older versions.
1> [CMake] 
1> [CMake] 
1> [CMake] CMake Warning (dev) at C:/Program Files (x86)/Microsoft Visual Studio/2019/Enterprise/Common7/IDE/CommonExtensions/Microsoft/CMake/CMake/share/cmake-3.19/Modules/FindPackageHandleStandardArgs.cmake:426 (message):
1> [CMake]   The package name passed to `find_package_handle_standard_args` (LIBZMQ)
1> [CMake]   does not match the name of the calling package (libzmq).  This can lead to
1> [CMake]   problems in calling code that expects `find_package` result variables
1> [CMake]   (e.g.,`_FOUND`) to follow a certain pattern.
1> [CMake] Call Stack (most recent call first):
1> [CMake]   extlibs/czmq/Findlibzmq.cmake:83 (find_package_handle_standard_args)
1> [CMake]   extlibs/czmq/CMakeLists.txt:133 (find_package)
1> [CMake] This warning is for project developers.  Use -Wno-dev to suppress it.
1> [CMake] -- Could NOT find LIBZMQ (missing: LIBZMQ_LIBRARIES) 
1> [CMake] CMake Error at extlibs/czmq/CMakeLists.txt:144 (message):
1> [CMake]   libzmq not found.
1> [CMake] 
1> [CMake] 
1> [CMake] -- Configuring incomplete,errors occurred!
1> [CMake] See also "<root>/build/x64/CMakeFiles/CMakeOutput.log".
1> [CMake] See also "<root>/build/x64/CMakeFiles/CMakeError.log".

钠和 zmq 函数正常工作,但 czmq 不能。由于我正在构建 libzmq 库,因此我在调用 CMake 时在配置时没有 .lib,因此 czmq 抱怨找不到 libzmq。

我将每个库安装到“root/build/x64/extlibs/”。我已经尝试了一个自定义目标依赖结构,但我没有运气让 czmq 在配置时没有看到 .lib 。我可以尝试做些什么来完成这项工作?谢谢!

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...