本文操作按照《c&c++开源库编译指南》中内容规范编写,编译环境配置、工具下载、目录规划,及更多其他开源库编译方法请参考该文章。
c&c++开源库编译指南:https://blog.youkuaiyun.com/binary0006/article/details/144086155
本文章中的源代码已提交到gitee仓库,地址:https://gitee.com/binary0010/depends/tree/master/c/brotli-1.1.0
1.brotli概述
brotli 是 Google 开发的高效无损压缩算法,基于 LZ77 和霍夫曼编码,通过字典优化与灵活压缩级别(0-11),在文本、代码等场景下实现比 gzip 高约 20% 的压缩率,同时保持快速解压速度。其流式处理特性适配现代网络协议,成为 Web 性能优化的核心技术之一。
brotli 广泛用于 Web 服务器(Nginx/Apache)与浏览器(Chrome/Firefox),通过 HTTP 压缩减少传输体积。移动端(如 Android)及文件存储领域(日志、配置)亦依赖其高压缩率降低资源消耗。开源代码支持多语言实现,BSD 许可推动跨平台集成,已成为 HTTPS 场景下提升数据传输效率的标准方案。
2.brotli编译
2.1.源代码下载
brotli源代码可以在github上下载,源代码下载地址:https://github.com/google/brotli/tags,找到最新版1.1.0版本,点击下图所示链接直接下载即可。

也可以自己复制这个地址下载:https://github.com/google/brotli/archive/refs/tags/v1.1.0.tar.gz
2.2.windows编译
先解压源代码到指定目录,brotli源代码中已经提供了CMakeList.txt脚本,后面我们按照规范会对该脚本进行修改。

2.2.1.源代码修改
由于brotil代码是c语言的,在vs2008中只支持c89标准语法,brotil代码中有一部分c99标准语法,为了支持vs2008我们对源代码进行修改。


2.2.2.修改CMake脚本
修改CMake脚本按照我们的设计的编译规范来进行构建和编译,修改源代码根目录下的CMakeLists.txt即可。
脚本涉及的内容主要是使用我们编译规范来对工程命名和输出,以及mt工程的链接库设置。
CMakeLists.txt完整内容:
# Available CMake versions:
# - Ubuntu 20.04 LTS : 3.16.3
# - Solaris 11.4 SRU 15 : 3.15
cmake_minimum_required(VERSION 3.15)
# Since this project's version is loaded from other files, this policy
# will help suppress the warning generated by cmake.
# This policy is set because we can't provide "VERSION" in "project" command.
# Use `cmake --help-policy CMP0048` for more information.
cmake_policy(SET CMP0048 NEW)
project(brotli C)
option(BUILD_SHARED_LIBS "Build shared libraries" ON)
if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
message(STATUS "Setting build type to Release as none was specified.")
set(CMAKE_BUILD_TYPE "Release" CACHE STRING "Choose the type of build." FORCE)
else()
message(STATUS "Build type is '${CMAKE_BUILD_TYPE}'")
endif()
include(CheckCSourceCompiles)
check_c_source_compiles(
"#if defined(__EMSCRIPTEN__)
int main() {return 0;}
#endif"
BROTLI_EMSCRIPTEN
)
if(BROTLI_EMSCRIPTEN)
message("-- Compiler is EMSCRIPTEN")
else()
message("-- Compiler is not EMSCRIPTEN")
endif()
# If Brotli is being bundled in another project, we don't want to
# install anything. However, we want to let people override this, so
# we'll use the BROTLI_BUNDLED_MODE variable to let them do that; just
# set it to OFF in your project before you add_subdirectory(brotli).
get_directory_property(BROTLI_PARENT_DIRECTORY PARENT_DIRECTORY)
if(NOT DEFINED BROTLI_BUNDLED_MODE)
# Bundled mode hasn't been set one way or the other, set the default
# depending on whether or not we are the top-level project.
if(BROTLI_PARENT_DIRECTORY)
set(BROTLI_BUNDLED_MODE ON)
else()
set(BROTLI_BUNDLED_MODE OFF)
endif()
endif()
mark_as_advanced(BROTLI_BUNDLED_MODE)
include(GNUInstallDirs)
# Reads macro from .h file; it is expected to be a single-line define.
function(read_macro PATH MACRO OUTPUT)
file(STRINGS ${PATH} _line REGEX "^#define +${MACRO} +(.+)$")
string(REGEX REPLACE "^#define +${MACRO} +(.+)$" "\\1" _val "${_line}")
set(${OUTPUT} ${_val} PARENT_SCOPE)
endfunction(read_macro)
# Version information
read_macro("c/common/version.h" "BROTLI_VERSION_MAJOR" BROTLI_VERSION_MAJOR)
read_macro("c/common/version.h" "BROTLI_VERSION_MINOR" BROTLI_VERSION_MINOR)
read_macro("c/common/version.h" "BROTLI_VERSION_PATCH" BROTLI_VERSION_PATCH)
set(BROTLI_VERSION "${BROTLI_VERSION_MAJOR}.${BROTLI_VERSION_MINOR}.${BROTLI_VERSION_PATCH}")
mark_as_advanced(BROTLI_VERSION BROTLI_VERSION_MAJOR BROTLI_VERSION_MINOR BROTLI_VERSION_PATCH)
# ABI Version information
read_macro("c/common/version.h" "BROTLI_ABI_CURRENT" BROTLI_ABI_CURRENT)
read_macro("c/common/version.h" "BROTLI_ABI_REVISION" BROTLI_ABI_REVISION)
read_macro("c/common/version.h" "BROTLI_ABI_AGE" BROTLI_ABI_AGE)
math(EXPR BROTLI_ABI_COMPATIBILITY "${BROTLI_ABI_CURRENT} - ${BROTLI_ABI_AGE}")
mark_as_advanced(BROTLI_ABI_CURRENT BROTLI_ABI_REVISION BROTLI_ABI_AGE BROTLI_ABI_COMPATIBILITY)
set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/../../cmake ${CMAKE_MODULE_PATH})
include(${CMAKE_CURRENT_SOURCE_DIR}/../../cmake/third-common.cmake)
set(INSTALL_BIN_DIR "${third-bin}/${PROJECT_NAME}-${B

最低0.47元/天 解锁文章
1339

被折叠的 条评论
为什么被折叠?



