为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
相关产品推荐
相关产品推荐

