You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为Android编译静态zlib:如何仅生成静态库?

仅生成zlib静态库的编译配置方案

问题

使用以下脚本编译zlib 1.3.1,已指定-DBUILD_SHARED_LIBS=OFF,预期仅生成静态库libz.a,但实际同时生成了libz.a和libz.so,如何配置才能仅生成静态库?

编译脚本:

#!/bin/sh
set -e

ZLIB_VERSION=1.3.1
VERSIONED_ZLIB=zlib-$ZLIB_VERSION
VERSIONED_ZLIB_FILE=$VERSIONED_ZLIB.tar.gz

MY_PWD=$PWD

echo "zlib version $ZLIB_VERSION"

if ! test -f $VERSIONED_ZLIB_FILE; then
    echo "Downloading..."
    curl -O https://www.zlib.net/$VERSIONED_ZLIB_FILE
fi

if ! test -d $VERSIONED_ZLIB; then 
    echo "Extracting..."
    tar -xvzf $VERSIONED_ZLIB_FILE
fi

export ANDROID_NDK_ROOT=$HOME/Android/Sdk/ndk/25.1.8937393/
ANDROID_API=23

for arch in "x86" "x86_64" "arm64" "arm"
do
    MY_VERSIONED_ZLIB=VERSIONED_ZLIB_$arch
    rm -rf $MY_VERSIONED_ZLIB
    cp -r $VERSIONED_ZLIB $MY_VERSIONED_ZLIB

    case $arch in
        arm)
            ANDROID_API=23
        ARCH_PATH=armeabi-v7a
            ;;
        x86)
            ANDROID_API=23
        ARCH_PATH=x86
            ;;
        arm64)
            ANDROID_API=23
        ARCH_PATH=arm64-v8a
            ;;
        x86_64)
            ANDROID_API=23
        ARCH_PATH=x86_64
            ;;
    esac

    ANDROID_TOOLCHAIN=""
    for host in "linux-x86_64" "linux-x86" "darwin-x86_64" "darwin-x86"
    do
        if [ -d "$ANDROID_NDK_ROOT/toolchains/llvm/prebuilt/$host/bin" ]; then
            ANDROID_TOOLCHAIN="$ANDROID_NDK_ROOT/toolchains/llvm/prebuilt/$host/bin"
            break
        fi
    done

    export PATH="$ANDROID_TOOLCHAIN":"$PATH"

    MY_PREFIXDIR=$PWD/prebuilt/android/$ARCH_PATH
    rm -rf $MY_PREFIXDIR

    cd $MY_VERSIONED_ZLIB

    MY_CMAKE_FLAGS="-DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK_ROOT/build/cmake/android.toolchain.cmake -DANDROID_ABI=$ARCH_PATH -DANDROID_NATIVE_API_LEVEL=$ANDROID_API"
    MY_CMAKE_FLAGS="$MY_CMAKE_FLAGS -DBUILD_SHARED_LIBS=OFF -DCMAKE_INSTALL_PREFIX=$MY_PREFIXDIR -B bld"

    cmake $MY_CMAKE_FLAGS
    cmake --build bld --config Release --target install
   
    cd $MY_PWD
    rm -rf $MY_VERSIONED_ZLIB
done

rm -rf $VERSIONED_ZLIB
rm $VERSIONED_ZLIB_FILE

echo Done.

解决方案

zlib的CMake配置中,除了通用的BUILD_SHARED_LIBS,还有自身专属的ZLIB_BUILD_SHARED选项控制动态库构建,该选项优先级更高。只需在CMake参数中添加-DZLIB_BUILD_SHARED=OFF即可强制关闭动态库生成。

修改后的CMake参数部分代码:

MY_CMAKE_FLAGS="-DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK_ROOT/build/cmake/android.toolchain.cmake -DANDROID_ABI=$ARCH_PATH -DANDROID_NATIVE_API_LEVEL=$ANDROID_API"
MY_CMAKE_FLAGS="$MY_CMAKE_FLAGS -DBUILD_SHARED_LIBS=OFF -DZLIB_BUILD_SHARED=OFF -DCMAKE_INSTALL_PREFIX=$MY_PREFIXDIR -B bld"

补充说明

  • ZLIB_BUILD_STATIC选项默认开启,无需额外指定,若需明确可添加-DZLIB_BUILD_STATIC=ON。
  • 脚本中已做了构建目录和安装目录的清理,确保每次编译都是全新环境,无需额外调整。

内容的提问来源于stack exchange,提问作者Alexander Dyagilev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 04:18:11