bzip2编译
1.源代码下载
源代码下载地址:https://sourceforge.net/projects/bzip2/files/,此处选择1.0.6版本下载。
2. windwos编译
先解压源代码到指定目录,查看bzip2代码目录,里面提供了vc5.0的工程(不要问为什么不是vc6.0,打开文件看一下就知道了)。
为方便跨平台构建和后续统一管理,这里使用cmake进行构建,在代码根目录创建一个CMakeLists.txt文件,内容参考zlib的CMakeLists.txt编写。
cmake_minimum_required(VERSION 2.4.4)
set(CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS ON)
project(bzip2)
set(VERSION "1.0.8")
# set(INSTALL_BIN_DIR "${CMAKE_INSTALL_PREFIX}/bin" CACHE PATH "Installation directory for executables")
# set(INSTALL_LIB_DIR "${CMAKE_INSTALL_PREFIX}/lib" CACHE PATH "Installation directory for libraries")
# set(INSTALL_INC_DIR "${CMAKE_INSTALL_PREFIX}/include" CACHE PATH "Installation directory for headers")
# set(INSTALL_MAN_DIR "${CMAKE_INSTALL_PREFIX}/share/man" CACHE PATH "Installation directory for manual pages")
# set(INSTALL_PKGCONFIG_DIR "${CMAKE_INSTALL_PREFIX}/share/pkgconfig" CACHE PATH "Installation directory for pkgconfig (.pc) files")
include(CheckTypeSize)
include(CheckFunctionExists)
include(CheckIncludeFile)
include(CheckCSourceCompiles)
enable_testing()
check_include_file(sys/types.h HAVE_SYS_TYPES_H)
check_include_file(stdint.h HAVE_STDINT_H)
check_include_file(stddef.h HAVE_STDDEF_H)
#
# Check to see if we have large file support
#
set(CMAKE_REQUIRED_DEFINITIONS -D_LARGEFILE64_SOURCE=1)
# We add these other definitions here because CheckTypeSize.cmake
# in CMake 2.4.x does not automatically do so and we want
# compatibility with CMake 2.4.x.
if(HAVE_SYS_TYPES_H)
list(APPEND CMAKE_REQUIRED_DEFINITIONS -DHAVE_SYS_TYPES_H)
endif()
if(HAVE_STDINT_H)
list(APPEND CMAKE_REQUIRED_DEFINITIONS -DHAVE_STDINT_H)
endif()
if(HAVE_STDDEF_H)
list(APPEND CMAKE_REQUIRED_DEFINITIONS -DHAVE_STDDEF_H)
endif()
check_type_size(off64_t OFF64_T)
if(HAVE_OFF64_T)
add_definitions(-D_LARGEFILE64_SOURCE=1)
endif()
set(CMAKE_REQUIRED_DEFINITIONS) # clear variable
#
# Check for fseeko
#
check_function_exists(fseeko HAVE_FSEEKO)
if(NOT HAVE_FSEEKO)
add_definitions(-DNO_FSEEKO)
endif()
#
# Check for unistd.h
#
check_include_file(unistd.h Z_HAVE_UNISTD_H)
# vs编译器特化设置
if(MSVC)
# debug工程生成的二进制文件名后增加“d”字符
set(CMAKE_DEBUG_POSTFIX "d")
# 增加宏定义
add_definitions(-D_CRT_SECURE_NO_DEPRECATE)
add_definitions(-D_CRT_NONSTDC_NO_DEPRECATE)
include_directories(${CMAKE_CURRENT_SOURCE_DIR})
# 模块定义文件变量
set(BZIP2_DEF ${CMAKE_CURRENT_SOURCE_DIR}/bzip2.def)
set(BZIP2D_DEF ${CMAKE_CURRENT_SOURCE_DIR}/bzip2d.def)
set(BZIP2MT_DEF ${CMAKE_CURRENT_SOURCE_DIR}/bzip2mt.def)
set(BZIP2MTD_DEF ${CMAKE_CURRENT_SOURCE_DIR}/bzip2mtd.def)
# # 连接器 -> 输入 -> 模块定义文件
# if(MSVC_STATIC_RUNTIME)
# set(BZIP2_DEF bzip2mtd.def)
# else()
# set(BZIP2_DEF bzip2d.def)
# endif()
# if(MSVC_STATIC_RUNTIME)
# set(BZIP2_DEF bzip2mt.def)
# else()
# set(BZIP2_DEF bzip2.def)
# endif()
endif()
set(BZIP2_PUBLIC_HDRS
bzlib.h
)
set(BZIP2_PRIVATE_HDRS
bzlib_private.h
)
set(BZIP2_SRCS
blocksort.c
bzlib.c
compress.c
crctable.c
decompress.c
huffman.c
randtable.c
)
# 动态库工程
add_library(bzip2 SHARED ${BZIP2_PUBLIC_HDRS} ${BZIP2_PRIVATE_HDRS} ${BZIP2_SRCS})
# 静态库工程
add_library(bzip2static STATIC ${BZIP2_PUBLIC_HDRS} ${BZIP2_PRIVATE_HDRS} ${BZIP2_SRCS})
# vs编译器特化设置
if(MSVC)
# 设置 连接器 -> 输入 -> 模块定义文件 默认md编译方式
set_target_properties(bzip2 PROPERTIES
LINK_FLAGS_DEBUG "/DEF:\"${BZIP2D_DEF}\""
LINK_FLAGS_RELEASE "/DEF:\"${BZIP2_DEF}\""
LINK_FLAGS_MINSIZEREL "/DEF:\"${BZIP2_DEF}\""
LINK_FLAGS_RELWITHDEBINFO "/DEF:\"${BZIP2_DEF}\""
)
# c++ -> 代码生成 -> 运行库
option(MSVC_STATIC_RUNTIME "Link with static msvc runtime libraries" OFF)
if(MSVC_STATIC_RUNTIME)
# switch from dynamic to static linking of msvcrt
foreach(flag_var
CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE
CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO
CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE
CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO)
if(${flag_var} MATCHES "/MD")
string(REGEX REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}")
endif()
endforeach()
set_target_properties(bzip2 PROPERTIES OUTPUT_NAME "bzip2mt")
set_target_properties(bzip2static PROPERTIES OUTPUT_NAME "bzip2staticmt")
# 设置 连接器 -> 输入 -> 模块定义文件 默认md编译方式
set_target_properties(bzip2 PROPERTIES
LINK_FLAGS_DEBUG "/DEF:\"${BZIP2MTD_DEF}\""
LINK_FLAGS_RELEASE "/DEF:\"${BZIP2MT_DEF}\""
LINK_FLAGS_MINSIZEREL "/DEF:\"${BZIP2MT_DEF}\""
LINK_FLAGS_RELWITHDEBINFO "/DEF:\"${BZIP2MT_DEF}\""
)
endif()
set(CMAKE_INSTALL_PREFIX "D:/clib/third-party-binary/win32_msvc2008/bzip2" CACHE PATH "Install path prefix")
endif()
# 安装编译输出的二进制文件
if(NOT SKIP_INSTALL_LIBRARIES AND NOT SKIP_INSTALL_ALL)
# install(TARGETS bzip2 bzip2static
# RUNTIME DESTINATION "${INSTALL_BIN_DIR}"
# ARCHIVE DESTINATION "${INSTALL_LIB_DIR}"
# LIBRARY DESTINATION "${INSTALL_LIB_DIR}" )
install(TARGETS bzip2 bzip2static
RUNTIME DESTINATION "bin"
ARCHIVE DESTINATION "lib"
LIBRARY DESTINATION "lib")
endif()
# 安装外部开发时需要的头文件
if(NOT SKIP_INSTALL_HEADERS AND NOT SKIP_INSTALL_ALL)
install(FILES ${BZIP2_PUBLIC_HDRS} DESTINATION "include")
endif()
对于动态库的工程在vs中导出函数需要使用.def文件,不同编译选项生成的动态库文件名称不相同,这里还需要准备4个.def文件,文件中内容除了第一行不同,其他的都是一样的。
LIBRARY bzip2
EXPORTS
BZ2_bzCompressInit
BZ2_bzCompress
BZ2_bzCompressEnd
BZ2_bzDecompressInit
BZ2_bzDecompress
BZ2_bzDecompressEnd
BZ2_bzReadOpen
BZ2_bzReadClose
BZ2_bzReadGetUnused
BZ2_bzRead
BZ2_bzWriteOpen
BZ2_bzWrite
BZ2_bzWriteClose
BZ2_bzWriteClose64
BZ2_bzBuffToBuffCompress
BZ2_bzBuffToBuffDecompress
BZ2_bzlibVersion
BZ2_bzopen
BZ2_bzdopen
BZ2_bzread
BZ2_bzwrite
BZ2_bzflush
BZ2_bzclose
BZ2_bzerror
2.1. vs2008 MD编译
前面CMakeLists.txt文件中设置的默认cmake构建就是MD方式,在cmake是不需要修改设置,这里只需要将目录D:/clib/third-party-binary/win32_msvc2008/bzip2相关参数修改一下即可。
2.1.1. cmake构建目录设置
选择源代码根目录(CMakeLists.txt文件在这个目录),设置build目录为源代码根目录下的cmake-vs2008,保证源代码目录干净,会生成工程和临时文件,同时也方便后续有其他的构建工具扩展管理。
2.1.2. 应用CMake配置
点击“Configure”等待配置参数完成,将安装目录修改为D:/clib/third-party-binary/win32_msvc2008/bzip2。
2.1.3. 生成vs工程
点击“Generate”等待完成,会在D:\clib\bzip2-1.0.6\cmake-vs2008目录vs2008的解决方案文件“bzip2.sln”。
2.1.4. 编译工程
使用vs2008打开“bzip2.sln”解决方案文件,分别编译Debug和MinSizeRel配置。
2.1.5. 安装库文件、头文件
编译Install工程的Debug和MinSizeRel配置,.h文件和编译生成.dll、.lib文件会拷贝到前面设置的路径下。
动态库文件:bin目录下的bzip2.dll、bzip2d.dll,分别对应lib目录下的bzip2.lib、bzip2d.lib。
纯静态库文件(开发时只需要头文件和该静态库文件):lib目录下的bzip2static.lib、bzip2staticd.lib。
2.2. vs2008MT编译
2.2.1. 修改mt编译配置
windows下MT的编译过程与MD的是相同的,只需要在CMake生成vs工程的时候修改一下CMake配置即可,配置在前面步骤的CMakeLists.txt文件中的已经配置好了。
按照下图设置勾选后,点击“Generate”后会重新生成工程,在工厂属性中查看“C/C++”->“代码生产”已经修改为md配置。
其余操作与MD编译相同,编译工程、安装文件等。
动态库文件:bin目录下的bzip2mt.dll、bzip2mtd.dll,分别对应lib目录下的bzip2mt.lib、bzip2mtd.lib。
纯静态库文件(开发时只需要头文件和该静态库文件):lib目录下的bzip2staticmt.lib、bzip2staticmtd.lib。