【问题标题】:CMake manage dependency (libsodium)CMake 管理依赖项(libsodium)
【发布时间】:2020-03-05 15:22:57
【问题描述】:

我正在编写一个 C++ 命令行工具。对于构建系统,我使用 CMake。

我的应用程序需要libsodium。它应该在 Windows 和 Linux 下编译。尤其是对于 CI/CD,它需要一种自行管理依赖关系的好方法。

第一种方法

在之前的项目中,我总是像 link 那样通过 CMake 添加所需的依赖项(让 CMake 来完成所有工作)。

我也尝试过使用 libsodium,但它有点复杂,因为钠不正式支持 CMake。 (我收到链接器错误)

第二种方法

所以我尝试了另一种方法。在寻找在 CMake 中处理依赖项的不同方法时,我发现了 Hunter。我认为这是添加依赖项的另一种巧妙方法。所以我尝试了这个:

cmake_minimum_required(VERSION 3.15.2)

include("cmake/HunterGate.cmake")
HunterGate(
    URL "https://github.com/cpp-pm/hunter/archive/v0.23.244.tar.gz"
    SHA1 "2c0f491fd0b80f7b09e3d21adb97237161ef9835"
)

project(someProject)


hunter_add_package(libsodium)
find_package(libsodium CONFIG REQUIRED)

...

target_link_libraries(someProject
    libsodium::libsodium
    )

我在使用 Hunter 时遇到的错误:

[hunter] Calculating Toolchain-SHA1
[hunter] Calculating Config-SHA1
[hunter] HUNTER_ROOT: C:/.hunter
[hunter] [ Hunter-ID: 2c0f491 | Toolchain-ID: 9e19749 | Config-ID: 711bb51 ]
[hunter] LIBSODIUM_ROOT: C:/.hunter/_Base/2c0f491/9e19749/711bb51/Install (ver.: 1.0.16-p0)
[hunter] Building libsodium
[hunter ** FATAL ERROR **] Build step failed (dir: C:/.hunter/_Base/2c0f491/9e19749/711bb51/Build/libsodium
[hunter ** FATAL ERROR **] [Directory:C:/.hunter/_Base/Download/Hunter/0.23.244/2c0f491/Unpacked/cmake/projects/libsodium]
------------------------------ ERROR -----------------------------
    https://hunter.readthedocs.io/en/latest/reference/errors/error.external.build.failed.html
------------------------------------------------------------------
CMake Error at C:/.hunter/_Base/Download/Hunter/0.23.244/2c0f491/Unpacked/cmake/modules/hunter_error_page.cmake:12 (message):
Call Stack (most recent call first):
  C:/.hunter/_Base/Download/Hunter/0.23.244/2c0f491/Unpacked/cmake/modules/hunter_fatal_error.cmake:20 (hunter_error_page)
  C:/.hunter/_Base/Download/Hunter/0.23.244/2c0f491/Unpacked/cmake/modules/hunter_download.cmake:623 (hunter_fatal_error)
  C:/.hunter/_Base/Download/Hunter/0.23.244/2c0f491/Unpacked/cmake/projects/libsodium/hunter.cmake:59 (hunter_download)
  C:/.hunter/_Base/Download/Hunter/0.23.244/2c0f491/Unpacked/cmake/modules/hunter_add_package.cmake:62 (include)
  CMakeLists.txt:13 (hunter_add_package)


Configuring incomplete, errors occurred!

Hunter 中的包是坏了还是我需要做一些不同的事情?

有没有人知道如何巧妙而轻松地管理这些依赖关系?我会很高兴有任何答案。即使它是一个完整的其他方法......谢谢

编辑 1:构建错误

C:\Users\SORKAL~1\AppData\Local\Temp\cclEnZwH.s: Assembler messages:
C:\Users\SORKAL~1\AppData\Local\Temp\cclEnZwH.s:30: Error: invalid register for .seh_savexmm
C:\Users\SORKAL~1\AppData\Local\Temp\cclEnZwH.s:32: Error: invalid register for .seh_savexmm
C:\Users\SORKAL~1\AppData\Local\Temp\cclEnZwH.s:34: Error: invalid register for .seh_savexmm
C:\Users\SORKAL~1\AppData\Local\Temp\cclEnZwH.s:36: Error: invalid register for .seh_savexmm
C:\Users\SORKAL~1\AppData\Local\Temp\cclEnZwH.s:38: Error: invalid register for .seh_savexmm
C:\Users\SORKAL~1\AppData\Local\Temp\cclEnZwH.s:40: Error: invalid register for .seh_savexmm
C:\Users\SORKAL~1\AppData\Local\Temp\cclEnZwH.s:42: Error: invalid register for .seh_savexmm
C:\Users\SORKAL~1\AppData\Local\Temp\cclEnZwH.s:44: Error: invalid register for .seh_savexmm
C:\Users\SORKAL~1\AppData\Local\Temp\cclEnZwH.s:46: Error: invalid register for .seh_savexmm
C:\Users\SORKAL~1\AppData\Local\Temp\cclEnZwH.s:48: Error: invalid register for .seh_savexmm
C:\Users\SORKAL~1\AppData\Local\Temp\cclEnZwH.s:50: Error: invalid register for .seh_savexmm
C:\Users\SORKAL~1\AppData\Local\Temp\cclEnZwH.s:544: Error: invalid register for .seh_savexmm
C:\Users\SORKAL~1\AppData\Local\Temp\cclEnZwH.s:546: Error: invalid register for .seh_savexmm
C:\Users\SORKAL~1\AppData\Local\Temp\cclEnZwH.s:548: Error: invalid register for .seh_savexmm
C:\Users\SORKAL~1\AppData\Local\Temp\cclEnZwH.s:550: Error: invalid register for .seh_savexmm
C:\Users\SORKAL~1\AppData\Local\Temp\cclEnZwH.s:552: Error: invalid register for .seh_savexmm
C:\Users\SORKAL~1\AppData\Local\Temp\cclEnZwH.s:554: Error: invalid register for .seh_savexmm
C:\Users\SORKAL~1\AppData\Local\Temp\cclEnZwH.s:556: Error: invalid register for .seh_savexmm
C:\Users\SORKAL~1\AppData\Local\Temp\cclEnZwH.s:558: Error: invalid register for .seh_savexmm
C:\Users\SORKAL~1\AppData\Local\Temp\cclEnZwH.s:560: Error: invalid register for .seh_savexmm
C:\Users\SORKAL~1\AppData\Local\Temp\cclEnZwH.s:562: Error: invalid register for .seh_savexmm
C:\Users\SORKAL~1\AppData\Local\Temp\cclEnZwH.s:564: Error: invalid register for .seh_savexmm
C:\Users\SORKAL~1\AppData\Local\Temp\cclEnZwH.s:566: Error: invalid register for .seh_savexmm

【问题讨论】:

  • 我没用过,不过也有柯南包管理器,官方包仓库里好像有libsodium。也许你可以用它来代替 Hunter:conan.io

标签: c++ cmake dependencies


【解决方案1】:

很久以前,但这是我最终所做的:

1。柯南

@R2RT 建议我尝试了 conan.io,但遗憾的是,Windows MinGW 没有预构建二进制文件。由于我没有时间处理 conan.io 生态系统,我放弃了该计划。

2。猎人

几乎可以正常工作...但最后我的公司有一个愚蠢的代理...因此 Hunter 不知道我公司注入的 SSL 证书,我也无法做到这一点。

3。回到第一个计划

最后我决定再给 CMake External_Progject 一个机会。这终于奏效了。

为此,我为 libsodium 编写了一个非常粗糙的 CMake 脚本,如下所示:

cmake_minimum_required(VERSION 3.5.0)
project(libsodium VERSION 1.0.32 LANGUAGES C CXX ASM)

INCLUDE(CheckCCompilerFlag)

#----------------------------------------------------------
######################### OPTIONS #########################
#----------------------------------------------------------

OPTION(LIBSODIUM_BUILD_SHARED_LIBRARIES "Build the library dynamically (ON/TRUE) or statically (OFF/FALSE).")
OPTION(ENABLE_BLOCKING_RANDOM           "Enable this switch only if /dev/urandom is totally broken on the target platform.")
OPTION(ENABLE_MINIMAL_BUILD             "Only compile the minimum set of functions required for the high-level API.")
OPTION(ENABLE_TESTS                     "Enable testing.")
OPTION(DISABLE_ASM                      "Disable AMD64 assembly implementations.")
OPTION(DISABLE_PIE                      "Do not produce position independent executables.")
OPTION(DISABLE_SSP                      "Do not compile with -fstack-protector.")

#----------------------------------------------------------
######################### VERSION #########################
#----------------------------------------------------------

SET(VERSION 1.0.3)
SET(SODIUM_LIBRARY_VERSION_MAJOR 7)
SET(SODIUM_LIBRARY_VERSION_MINOR 5)
SET(DLL_VERSION 6)

SET(SODIUM_LIBRARY_VERSION "15:0:2")
#                            | | |
#                     +------+ | +---+
#                     |        |     |
#                  current:revision:age
#                     |        |     |
#                     |        |     +- increment if interfaces have been added
#                     |        |        set to zero if interfaces have been removed
#                     |        |        or changed
#                     |        +- increment if source code has changed
#                     |           set to zero if current is incremented
#                     +- increment if interfaces have been added, removed or changed

CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/src/libsodium/include/sodium/version.h.in ${CMAKE_CURRENT_SOURCE_DIR}/src/libsodium/include/sodium/version.h)
CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/src/libsodium/include/sodium/version.h.in ${CMAKE_CURRENT_BINARY_DIR}/src/libsodium/include/sodium/version.h)


#----------------------------------------------------------
##################### SOURCE / HEADERS ####################
#----------------------------------------------------------

INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/src)
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/src/libsodium)
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/src/libsodium/include)
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/src/libsodium/include/sodium)
#For version.h.in to version.h
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR}/src/libsodium/include/sodium)

file(GLOB_RECURSE libsodium_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/src/libsodium/*.h)

file(GLOB_RECURSE libsodium_SOURCE ${CMAKE_CURRENT_SOURCE_DIR}/src/libsodium/*.c)

#----------------------------------------------------------
######################### LIBRARY #########################
#----------------------------------------------------------

set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/build")


IF(ENABLE_BLOCKING_RANDOM)
    ADD_DEFINITIONS("-DUSE_BLOCKING_RANDOM")
ENDIF(ENABLE_BLOCKING_RANDOM)

IF(LIBSODIUM_BUILD_SHARED_LIBRARIES)
    ADD_LIBRARY(libsodium SHARED ${libsodium_HEADERS} ${libsodium_SOURCE})
ELSE(LIBSODIUM_BUILD_SHARED_LIBRARIES)
    ADD_DEFINITIONS("-DSODIUM_STATIC")
    ADD_LIBRARY(libsodium STATIC ${libsodium_HEADERS} ${libsodium_SOURCE})
ENDIF(LIBSODIUM_BUILD_SHARED_LIBRARIES)

SET_TARGET_PROPERTIES(libsodium PROPERTIES
    LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/lib
    ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/lib
    PROJECT_LABEL "libsodium"
)

这受到我在寻找解决方案时发现的一些 CMakeLists 的启发。我对这个解决方案并不完全满意,但我决定我未来的我应该关心这个。

【讨论】:

    【解决方案2】:

    尝试在 find_package 中将 libsodium 版本指定为 1.0.16。 Hunter 似乎对 1.0.16-p0 版本有一个错误/遗漏。如果您查看here,您会发现它不会检查此版本,因此会尝试选择错误的(?)默认方案 url_sha1_cmake。 (我认为,CMake 很难阅读。)

    欢迎来到 C++ 依赖管理这个地狱。

    【讨论】:

      猜你喜欢
      • 2021-09-09
      • 1970-01-01
      • 1970-01-01
      • 2011-09-04
      • 2016-07-06
      • 1970-01-01
      • 2015-03-20
      • 1970-01-01
      • 2017-01-14
      相关资源
      最近更新 更多