依赖库
bZip2 ( https://github.com/philr/bzip2-windows/releases/tag/v1.0.8.0 )
lzma ( https://github.com/ImageMagick/lzma )
zstd( https://github.com/facebook/zstd )
openssl ( https://github.com/openssl/openssl/releases/tag/openssl-3.3.0 )
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
手动安装openssl前要安装perl,官网地址: https://strawberryperl.com/;CSDN :下载文件
下载openssl代码
下载NASM (strawberryperl 默认安装了,如果activeperl 则需要)(https://www.nasm.us/pub/nasm/releasebuilds/2.16.02/win64/ )
启动对应工具链的命令行提示工具
进入下载的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