依赖库

1. Note

  • 在libarchive/build/下创建depends目录

  • 使用统一的vs编译链 如 “Visual Studio 2019 (v142)

2. bzip2

  • 下载后制作目录为库格式即可(include , lib, bin)

  • 需要 vcruntime140.dll 文件以支持bzip2 使用

  • 在libarchive/build/depends 下创建bzip2,例:

  • 在libarchive/build/cmake 目录下加入 FindBZip2.cmake

# - Find BZip2
# Find the BZip2 include directory and library
#
#  BZIP2_INCLUDE_DIR    - where to find bzlib.h, etc.
#  BZIP2_LIBRARIES      - List of libraries when using BZip2.
#  BZIP2_FOUND          - True if BZip2 found.


message(STATUS "Looking for BZip2")

set(BZIP2_SEARCH_PATH ${CMAKE_CURRENT_LIST_DIR}/../depends/bzip2)

IF (BZIP2_INCLUDE_DIR)
    # Already in cache, be silent
    SET(BZIP2_FIND_QUIETLY TRUE)
ENDIF (BZIP2_INCLUDE_DIR)

FIND_PATH(BZIP2_INCLUDE_DIR bzlib.h PATHS ${BZIP2_SEARCH_PATH}/include)
FIND_LIBRARY(BZIP2_LIBRARY NAMES bz2 libbz2 PATHS ${BZIP2_SEARCH_PATH}/lib)

# handle the QUIETLY and REQUIRED arguments and set BZIP2_FOUND to TRUE if
# all listed variables are TRUE
INCLUDE(FindPackageHandleStandardArgs)
FIND_PACKAGE_HANDLE_STANDARD_ARGS(BZip2 DEFAULT_MSG BZIP2_LIBRARY BZIP2_INCLUDE_DIR)

IF(BZIP2_FOUND)
    SET(BZIP2_LIBRARIES ${BZIP2_LIBRARY})
ENDIF(BZIP2_FOUND)

3. lzma

  • 使用vs打开下载的代码目录windows\vs2019\xz_win.sln ( )

  • 直接使用 Release x64 编译,在解决方案 的 右键菜单中选择 生成解决方案

  • 手动制作依赖库目录 并放置在libarcihve/build/depends/lzma目录下,例:

    • bin

      • liblzma.dll

    • include

      • lzma.h

      • lzma 文件夹

    • lib

      • liblzma.lib

      • liblzmastatic.lib

  • 在libarchive/build/cmake 目录下加入 FindLibLZMA.cmake

# - Find LibLZMA
# Find the LibLZMA include directory and library
#
#  LibLZMA_INCLUDE_DIR    - where to find lzma.h, etc.
#  LibLZMA_LIBRARIES      - List of libraries when using LibLZMA.
#  LibLZMA_FOUND          - True if LibLZMA found.


message(STATUS "Looking for LibLZMA")

set(LibLZMA_SEARCH_PATH ${CMAKE_CURRENT_LIST_DIR}/../depends/lzma)

IF (LibLZMA_INCLUDE_DIR)
    # Already in cache, be silent
    SET(LibLZMA_FIND_QUIETLY TRUE)
ENDIF (LibLZMA_INCLUDE_DIR)

FIND_PATH(LIBLZMA_INCLUDE_DIRS lzma.h PATHS ${LibLZMA_SEARCH_PATH}/include)
FIND_LIBRARY(LIBLZMA_LIBRARIES NAMES liblzma PATHS ${LibLZMA_SEARCH_PATH}/lib)

if(LIBLZMA_USE_STATIC_LIBS)
    # Look for the static library liblzmastatic.lib
    FIND_LIBRARY(LIBLZMA_LIBRARIES NAMES liblzmastatic PATHS ${LibLZMA_SEARCH_PATH}/lib)
else()
    # Look for the dynamic library liblzma.dll
    FIND_LIBRARY(LIBLZMA_LIBRARIES NAMES liblzma PATHS ${LibLZMA_SEARCH_PATH}/lib)
endif()


# handle the QUIETLY and REQUIRED arguments and set LibLZMA_FOUND to TRUE if
# all listed variables are TRUE
INCLUDE(FindPackageHandleStandardArgs)

IF (LIBLZMA_LIBRARIES)
    SET(LibLZMA_FOUND TRUE)
ENDIF()

FIND_PACKAGE_HANDLE_STANDARD_ARGS(LibLZMA DEFAULT_MSG LIBLZMA_LIBRARIES LIBLZMA_INCLUDE_DIRS)


4. lz4

  • 使用vs打开下载的sln工程文件 lz4-dev\build\VS2022\lz4.sln

  • 配置编译模式为 Release x64

  • 分别在 liblz4, liblz4-dll 的属性页 配置属性 | 常规 | 平台工具集下 配置为 Visual Studio 2019 (v142)

  • 对上述的两个项目分别在右键菜单中选择生成

  • 手动制作依赖库目录 并放置在libarcihve/build/depends/lz4目录下,例:

    • bin

      • liblz4.dll

    • include

      • lz4.h

      • lz4file.h

      • lz4frame.h

      • lz4frame_static.h

      • lz4hc.h

      • xxhash.h

    • lib

      • liblz4.lib

      • liblz4_static.lib

  • 更改根目录下CMakeLists.txt # Find LZ4 段

  • 旧代码

#
# Find LZ4
#
IF(ENABLE_LZ4)
  IF (LZ4_INCLUDE_DIR)
    # Already in cache, be silent
    SET(LZ4_FIND_QUIETLY TRUE)
  ENDIF (LZ4_INCLUDE_DIR)

  FIND_PATH(LZ4_INCLUDE_DIR lz4.h)
  FIND_LIBRARY(LZ4_LIBRARY NAMES lz4 liblz4)
  INCLUDE(FindPackageHandleStandardArgs)
  FIND_PACKAGE_HANDLE_STANDARD_ARGS(LZ4 DEFAULT_MSG LZ4_LIBRARY LZ4_INCLUDE_DIR)
ELSE(ENABLE_LZ4)
  SET(LZ4_FOUND FALSE) # Override cached value
ENDIF(ENABLE_LZ4)
IF(LZ4_FOUND)
  SET(HAVE_LIBLZ4 1)
  SET(HAVE_LZ4_H 1)
  CMAKE_PUSH_CHECK_STATE()	# Save the state of the variables
  SET(CMAKE_REQUIRED_INCLUDES ${LZ4_INCLUDE_DIR})
  CHECK_INCLUDE_FILES("lz4hc.h" HAVE_LZ4HC_H)
  CMAKE_POP_CHECK_STATE()	# Restore the state of the variables
  INCLUDE_DIRECTORIES(${LZ4_INCLUDE_DIR})
  LIST(APPEND ADDITIONAL_LIBS ${LZ4_LIBRARY})
  #
  # TODO: test for static library.
  #
ENDIF(LZ4_FOUND)
MARK_AS_ADVANCED(CLEAR LZ4_INCLUDE_DIR)
MARK_AS_ADVANCED(CLEAR LZ4_LIBRARY) 
  • 新代码

#
# Find LZ4
#
IF(ENABLE_LZ4)
  IF (LZ4_INCLUDE_DIR)
    # Already in cache, be silent
    SET(LZ4_FIND_QUIETLY TRUE)
  ENDIF (LZ4_INCLUDE_DIR)

  set(LZ4_SEARCH_PATH ${CMAKE_CURRENT_LIST_DIR}/build/depends/lz4)
  FIND_PATH(LZ4_INCLUDE_DIR lz4.h lz4hc.h PATHS ${LZ4_SEARCH_PATH}/include NO_CACHE REQUIRED)
  FIND_LIBRARY(LZ4_LIBRARY NAMES lz4 liblz4 PATHS ${LZ4_SEARCH_PATH}/lib NO_CACHE)

  INCLUDE(FindPackageHandleStandardArgs)
  FIND_PACKAGE_HANDLE_STANDARD_ARGS(LZ4 DEFAULT_MSG LZ4_LIBRARY LZ4_INCLUDE_DIR)
ELSE(ENABLE_LZ4)
  SET(LZ4_FOUND FALSE) # Override cached value
ENDIF(ENABLE_LZ4)
IF(LZ4_FOUND)
  SET(HAVE_LIBLZ4 1)
  SET(HAVE_LZ4_H 1)
  SET(HAVE_LZ4HC_H 1)

  INCLUDE_DIRECTORIES(${LZ4_INCLUDE_DIR})
  LIST(APPEND ADDITIONAL_LIBS ${LZ4_LIBRARY})
  #
  # TODO: test for static library.
  #
ENDIF(LZ4_FOUND)
MARK_AS_ADVANCED(CLEAR LZ4_INCLUDE_DIR)
MARK_AS_ADVANCED(CLEAR LZ4_LIBRARY)

5. zstd

  • 进入build目录,将项目使用编译器打开 如 Clion \VS ,选择工具链,直接编译即可

  • 手动制作依赖库目录 并放置在libarcihve/build/depends/zstd目录下,例:

    • bin

      • zstd.dll

    • include

      • zdict.h

      • zstd.h

      • zstd_errors.h

    • lib

      • zstd.lib

      • zstd_static.lib

  • 修改CMakeLists.txt下的 zstd段代码

  • 旧代码

#
# Find Zstd
#
IF(ENABLE_ZSTD)
  IF (ZSTD_INCLUDE_DIR)
    # Already in cache, be silent
    SET(ZSTD_FIND_QUIETLY TRUE)
  ENDIF (ZSTD_INCLUDE_DIR)

  IF(UNIX)
    FIND_PACKAGE(PkgConfig QUIET)
    PKG_SEARCH_MODULE(PC_ZSTD libzstd)
  ENDIF()

  FIND_PATH(ZSTD_INCLUDE_DIR zstd.h HINTS ${PC_ZSTD_INCLUDEDIR} ${PC_ZSTD_INCLUDE_DIRS})
  FIND_LIBRARY(ZSTD_LIBRARY NAMES zstd libzstd HINTS ${PC_ZSTD_LIBDIR} ${PC_ZSTD_LIBRARY_DIRS})
  INCLUDE(FindPackageHandleStandardArgs)
  FIND_PACKAGE_HANDLE_STANDARD_ARGS(ZSTD DEFAULT_MSG ZSTD_LIBRARY ZSTD_INCLUDE_DIR)
ELSE(ENABLE_ZSTD)
  SET(ZSTD_FOUND FALSE) # Override cached value
ENDIF(ENABLE_ZSTD)
IF(ZSTD_FOUND)
  SET(HAVE_ZSTD_H 1)
  INCLUDE_DIRECTORIES(${ZSTD_INCLUDE_DIR})
  LIST(APPEND ADDITIONAL_LIBS ${ZSTD_LIBRARY})
  CMAKE_PUSH_CHECK_STATE()
  SET(CMAKE_REQUIRED_LIBRARIES ${ZSTD_LIBRARY})
  SET(CMAKE_REQUIRED_INCLUDES ${ZSTD_INCLUDE_DIR})
  CHECK_FUNCTION_EXISTS(ZSTD_decompressStream HAVE_LIBZSTD)
  CHECK_FUNCTION_EXISTS(ZSTD_compressStream HAVE_ZSTD_compressStream)
  #
  # TODO: test for static library.
  #
  CMAKE_POP_CHECK_STATE()
ENDIF(ZSTD_FOUND)
MARK_AS_ADVANCED(CLEAR ZSTD_INCLUDE_DIR)
MARK_AS_ADVANCED(CLEAR ZSTD_LIBRARY)

  • 新代码

    #
    # Find Zstd
    #
    IF(ENABLE_ZSTD)
      IF (ZSTD_INCLUDE_DIR)
        # Already in cache, be silent
        SET(ZSTD_FIND_QUIETLY TRUE)
      ENDIF (ZSTD_INCLUDE_DIR)
    
      IF(UNIX)
        FIND_PACKAGE(PkgConfig QUIET)
        PKG_SEARCH_MODULE(PC_ZSTD libzstd)
      ENDIF()
      set(ZSTD_SEARCH_PATH ${CMAKE_CURRENT_LIST_DIR}/build/depends/zstd)
      FIND_PATH(ZSTD_INCLUDE_DIR zstd.h HINTS ${ZSTD_SEARCH_PATH}/include NO_CACHE REQUIRED)
      FIND_LIBRARY(ZSTD_LIBRARY NAMES zstd libzstd HINTS ${ZSTD_SEARCH_PATH}/lib NO_CACHE)
      INCLUDE(FindPackageHandleStandardArgs)
      FIND_PACKAGE_HANDLE_STANDARD_ARGS(ZSTD DEFAULT_MSG ZSTD_LIBRARY ZSTD_INCLUDE_DIR)
    ELSE(ENABLE_ZSTD)
      SET(ZSTD_FOUND FALSE) # Override cached value
    ENDIF(ENABLE_ZSTD)
    IF(ZSTD_FOUND)
      SET(HAVE_ZSTD_H 1)
      INCLUDE_DIRECTORIES(${ZSTD_INCLUDE_DIR})
      LIST(APPEND ADDITIONAL_LIBS ${ZSTD_LIBRARY})
      CMAKE_PUSH_CHECK_STATE()
      SET(CMAKE_REQUIRED_LIBRARIES ${ZSTD_LIBRARY})
      SET(CMAKE_REQUIRED_INCLUDES ${ZSTD_INCLUDE_DIR})
      CHECK_FUNCTION_EXISTS(ZSTD_decompressStream HAVE_LIBZSTD)
      CHECK_FUNCTION_EXISTS(ZSTD_compressStream HAVE_ZSTD_compressStream)
      #
      # TODO: test for static library.
      #
      CMAKE_POP_CHECK_STATE()
    ENDIF(ZSTD_FOUND)
    MARK_AS_ADVANCED(CLEAR ZSTD_INCLUDE_DIR)
    MARK_AS_ADVANCED(CLEAR ZSTD_LIBRARY)

6. openssl

  • 进入下载的oepnssl代码目录(注意需要考虑切换盘符的情况)

  • 在命令行中执行 perl Configure VC-WIN64A --prefix=F:\archive\depends\openssl-3.3.0

    • 如果只需要静态库 则添加no-shared 选项即可

    • --prefix 指定安装目录

  • 执行nmake 单线程10分钟左右

  • 安装二进制和库 nmake install_sw (使用 install_sw 代替 install 是因为默认 install 会生成 40M 左右的 HTML 文档,若不需要就使用 install_sw 仅安装二进制文件和库)

  • 删除 --prefix 目录下不必要的pdb调试符号文件

  • 进入 --prefix 下运行powershell ,输入命令 .\openssl.exe -version

  • 拷贝依赖库目录 并放置在libarcihve/build/depends/openssl目录

  • 删除openssl/lib 目录下的cmake

  • 从 cmake的安装目录(C:\Program Files\CMake\share\cmake-3.29\Modules)下 拷贝相关的识别 cmake的文件 到 libarchive/build/cmake 下

    • FindOpenSSL.cmake

    • FindPackageHandleStandardArgs.cmake

    • FindPackageMessage.cmake

    • SelectLibraryConfigurations.cmake

  • 修改CMakeLists.txt下的 openssl 段代码

  • 旧代码

#
# Find OpenSSL
# (Except on Mac, where OpenSSL is deprecated.)
#
IF(ENABLE_OPENSSL AND NOT CMAKE_SYSTEM_NAME MATCHES "Darwin")
  FIND_PACKAGE(OpenSSL)
  IF(OPENSSL_FOUND)
    SET(HAVE_LIBCRYPTO 1)
    INCLUDE_DIRECTORIES(${OPENSSL_INCLUDE_DIR})
    LIST(APPEND ADDITIONAL_LIBS ${OPENSSL_CRYPTO_LIBRARY})
    SET(CMAKE_REQUIRED_LIBRARIES ${OPENSSL_CRYPTO_LIBRARY})
    SET(CMAKE_REQUIRED_INCLUDES ${OPENSSL_INCLUDE_DIR})
    LA_CHECK_INCLUDE_FILE("openssl/evp.h" HAVE_OPENSSL_EVP_H)
    CHECK_FUNCTION_EXISTS(PKCS5_PBKDF2_HMAC_SHA1 HAVE_PKCS5_PBKDF2_HMAC_SHA1)
  ENDIF(OPENSSL_FOUND)
ELSE()
  SET(OPENSSL_FOUND FALSE) # Override cached value
ENDIF()
  • 新代码 增加OPENSSL_ROOT_DIR 用于搜索

#
# Find OpenSSL
# (Except on Mac, where OpenSSL is deprecated.)
#
IF(ENABLE_OPENSSL AND NOT CMAKE_SYSTEM_NAME MATCHES "Darwin")
  set(OPENSSL_ROOT_DIR ${CMAKE_CURRENT_LIST_DIR}/build/depends/openssl)
  FIND_PACKAGE(OpenSSL)
  IF(OPENSSL_FOUND)
    SET(HAVE_LIBCRYPTO 1)
    INCLUDE_DIRECTORIES(${OPENSSL_INCLUDE_DIR})
    LIST(APPEND ADDITIONAL_LIBS ${OPENSSL_CRYPTO_LIBRARY})
    SET(CMAKE_REQUIRED_LIBRARIES ${OPENSSL_CRYPTO_LIBRARY})
    SET(CMAKE_REQUIRED_INCLUDES ${OPENSSL_INCLUDE_DIR})
    LA_CHECK_INCLUDE_FILE("openssl/evp.h" HAVE_OPENSSL_EVP_H)
    CHECK_FUNCTION_EXISTS(PKCS5_PBKDF2_HMAC_SHA1 HAVE_PKCS5_PBKDF2_HMAC_SHA1)
  ENDIF(OPENSSL_FOUND)
ELSE()
  SET(OPENSSL_FOUND FALSE) # Override cached value
ENDIF()

编译archive (以clion为例)

设置编译环境 Release/VS2019

  • 添加CMAKE 选项 指定生成目录为 ./,clion下默认为cmake-build-release

-DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=./
  • 默认选中了 bsdtar ,可以不更改

  • 执行install 同时编译及安装

  • 拷贝输出目录下的bin,include,lib为库形式即可
    archive.zip


本站由 困困鱼 使用 Stellar 创建。