bzip2-1.0.6编译

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

binary0010

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值