zlib交叉编译

zlib下载

zlib介绍网址:https://zlib.net/

官方全版本下载:Index of /fossils

git clone:git clone https://github.com/madler/zlib.git

以下载的zlib-1.3.tar.gz为例:

zlib-1.3.tar.gz
#解压并进入libssh-0.10.6目录
tar -zxvf zlib-1.3.tar.gz 
cd zlib-1.3/

编译说明

由于目录下直接有makefile,而且makefile直接include了 Makefile.in 文件,并且在readme中有介绍:
根据大多数 Unix 系统上,按 Makefile.in 顶部的说明操作即可,查看 Makefile.in

# To compile and test, type:
#    ./configure; make test
# Normally configure builds both a static and a shared library.
# If you want to build just a static library, use: ./configure --static

# To install /usr/local/lib/libz.* and /usr/local/include/zlib.h, type:
#    make install
# To install in $HOME instead of /usr/local, use:
#    make install prefix=$HOME

直接执行./configure,然后进行编译make和安装make install

明显不符合需求,需要进行交叉编译,通过执行./configure -h来查看帮助:

./configure -h
usage:
  configure [--const] [--zprefix] [--prefix=PREFIX]  [--eprefix=EXPREFIX]
    [--static] [--64] [--libdir=LIBDIR] [--sharedlibdir=LIBDIR]
    [--includedir=INCLUDEDIR] [--archs="-arch i386 -arch x86_64"]

在通过查看configure文件可知:

# To impose specific compiler or flags or install directory, use for example:
#    prefix=$HOME CC=cc CFLAGS="-O4" ./configure
# or for csh/tcsh users:
#    (setenv prefix $HOME; setenv CC cc; setenv CFLAGS "-O4"; ./configure)

# Incorrect settings of CC or CFLAGS may prevent creating a shared library.
# If you have problems, try without defining CC and CFLAGS before reporting
# an error.

通过设置CC可以指定交叉编译工具链,加上–static可以编译为静态库。

configure配置介绍

根据 ./configure -h 输出的参数,以下是每个配置选项的详细说明:

  • –const

    # 启用 const 关键字,提高代码可读性
    ./configure --const
    
    • 作用:启用 C 语言的 const 关键字
    • 用途:让代码更严格,防止意外修改常量数据
    • 效果:在编译时增加 -Dconst= 标志
  • –zprefix

    # 在所有导出函数前加上 z_ 前缀
    ./configure --zprefix
    
    • 作用:在所有导出的 API 函数前加上 z_ 前缀
    • 用途:避免与其他库的命名冲突
    • 示例deflate 会变成 z_deflate
    • 使用场景:当系统中已有其他版本的 zlib 时使用
  • –prefix=PREFIX

    bash

    # 指定安装根目录
    ./configure --prefix=/usr/local
    ./configure --prefix=/root/workspace/lib_libary
    
    • 作用:指定安装的基础目录

    • 默认值:通常是 /usr/local

    • 安装结构

      PREFIX/include/  # 头文件
      PREFIX/lib/      # 库文件
      PREFIX/bin/      # 可执行文件
      PREFIX/share/    # 文档和数据文件
      
  • –eprefix=EXPREFIX

    bash

    # 指定架构相关文件的安装位置
    ./configure --eprefix=/usr/local/loongarch64
    
    • 作用:指定与架构相关的文件安装位置
    • 用途:在多架构系统上,区分架构相关和架构无关的文件
    • 示例:在交叉编译时很有用
  • –static

    # 只构建静态库
    ./configure --static
    
    • 作用:只构建静态库(.a 文件),不构建共享库(.so 文件)
    • 用途
      • 交叉编译时使用
      • 需要静态链接的应用程序
      • 嵌入式系统开发
    • 注意:默认情况下会同时构建静态库和共享库
  • –64

    # 启用 64 位模式
    ./configure --64
    
    • 作用:启用 64 位编译模式
    • 用途
      • 在 32 位系统上编译 64 位库
      • 确保使用 64 位数据类型
    • 注意:在现代 64 位系统上通常不需要
  • –libdir=LIBDIR

    bash

    # 指定库文件的安装目录
    ./configure --libdir=/root/workspace/lib_libary/lib64
    ./configure --libdir=/usr/local/lib/loongarch64
    
    • 作用:指定库文件(.a 和 .so)的安装目录
    • 默认值PREFIX/lib
    • 用途
      • 自定义库文件位置
      • 多架构支持(x86_64 和 loongarch64 分离)
  • –sharedlibdir=LIBDIR

    # 指定共享库的安装目录
    ./configure --sharedlibdir=/usr/local/lib64
    
    • 作用:指定共享库(.so)的安装目录
    • 默认值:与 --libdir 相同
    • 用途
      • 单独设置共享库位置
      • 遵循某些发行版的目录规范
  • –includedir=INCLUDEDIR

    # 指定头文件的安装目录
    ./configure --includedir=/root/workspace/lib_libary/include/zlib
    
    • 作用:指定 C 头文件的安装目录
    • 默认值PREFIX/include
    • 用途
      • 自定义头文件位置
      • 避免与系统头文件冲突
  • –archs=“-arch i386 -arch x86_64”

    bash

    # 指定要构建的架构(主要用于 macOS)
    ./configure --archs="-arch x86_64 -arch arm64"
    
    • 作用:指定要构建的 CPU 架构(主要用于 macOS 的通用二进制)
    • 用途
      • 构建支持多个架构的通用二进制
      • macOS 上的跨架构编译
    • 注意:这个选项主要是为 macOS 设计的

zlib交叉编译

通过上述介绍可以得知,有几种方式可以进行zlib库的交叉编译。

以龙芯交叉编译工具进行说明,Linux平台下编译,编译为静态库,工具链路径:

/opt/loongson-gnu-toolchain-13.2/bin

静态库存放路径:

/root/workspace/lib_libary

那么配置configure时输入以下指令后直接make即可进行编译:

  1. 使用./configure方式进行配置

    #按照configure文件中进行配置
    prefix=/root/workspace/lib_libary CC=/opt/loongson-gnu-toolchain-13.2/bin/loongarch64-unknown-linux-gnu-gcc ./configure --static
    make
    make install
    
    #或者
    export PATH=/opt/loongson-gnu-toolchain-13.2/bin:$PATH
    export CC=loongarch64-unknown-linux-gnu-gcc
    export AR=loongarch64-unknown-linux-gnu-ar
    export RANLIB=loongarch64-unknown-linux-gnu-ranlib
    export STRIP=loongarch64-unknown-linux-gnu-strip
    
    ./configure --prefix=/root/workspace/lib_libary --static --libdir=/root/workspace/lib_libary/lib --includedir=/root/workspace/lib_libary/include
    make
    make install
    

  2. 使用CMake进行交叉编译

    指令如下:

    #创建build文件夹并进入
    mkdir -p build && cd build
    
    #执行cmake并传递编译选项
    #CMAKE_INSTALL_PREFIX 编译完成后zlib库安装路径
    #CMAKE_C_COMPILER 指定 C 编译器的路径
    #CMAKE_AR 指定AR路径,用来链接编译出的.o文件为静态库文件
    #BUILD_SHARED_LIBS 是否编译动态共享库,OFF表示为否
    #CMAKE_SYSTEM_NAME 编译环境系统名
    #CMAKE_SYSTEM_PROCESSOR 编译环境系统架构
    cmake .. -DCMAKE_INSTALL_PREFIX=/root/workspace/lib_libary -DCMAKE_C_COMPILER=/opt/loongson-gnu-toolchain-13.2/bin/loongarch64-unknown-linux-gnu-gcc -DCMAKE_AR=/opt/loongson-gnu-toolchain-13.2/bin/loongarch64-unknown-linux-gnu-ar -DBUILD_SHARED_LIBS=OFF -DCMAKE_SYSTEM_NAME=Linux -DCMAKE_SYSTEM_PROCESSOR=loongarch64
    make
    make install
    

    编译完成后在目录/root/workspace/lib_libary下会生成如下文件夹:

    cd /root/workspace/lib_libary/
    include/ lib/     share/
    

    其中编译好的静态库在lib文件夹下。

    清理编译内容:

    make clean
    

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐