编译Android环境的libjpeg-turbo使用cmake

本文详细介绍了libjpeg-turbo 2.0.1版本在Android环境下的编译流程,包括编译环境设置、编译要求、环境变量配置、源码下载、编译脚本编写及执行,同时提供了去除动态库版本号的方法和常见编译问题解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. libjpeg-turbo

  前面已经编译过1.5.91版本的libjpeg-turbo,现在版本升级到2.0.1,基于CMake编译。

  依然还是一样,按照官网介绍,libjpeg-turbolibjpeg2-6倍,得益于它高度优化的哈夫曼算法。在许多情况下,libjpeg-turbo的性能可与专有的高速JPEG编解码器相媲美.

On such systems, libjpeg-turbo is generally 2-6x as fast as libjpeg, all else being equal. On other types of systems, libjpeg-turbo can still outperform libjpeg by a significant amount, by virtue of its highly-optimized Huffman coding routines. In many cases, the performance of libjpeg-turbo rivals that of proprietary high-speed JPEG codecs

2. 编译过程

2.1 编译环境

在Windows 10的虚拟机VM上的Ubuntu中编译
vm_Ubuntu

2.2 编译要求

我们将参照源码中的BUILDING.md编译,github地址BUILDING.md

NDK
Linux 64 位 (x86) / android-ndk-r15c
CMake
cmake-3.12.1-Linux-x86_64
NASM 或者 YASM
如果需要编译 x86 或者 x86-64的库,需要安装 NASM 2.10及以上或者 YASM 2.10及以上版本。

安装工具

2.3 配置环境变量

把Cmake配置进系统环境变量,当然这不是必须的。
cmake环境变量

2.4 编译

2.4.1 下载源码

  下载并解压源码https://github.com/libjpeg-turbo/libjpeg-turbo

2.4.2 编译脚本

2.4.2.1 sh编译脚本(自定义编译链)
注意
这种方式是完全按照源码中的 BUILDING.md构建,稍显复杂,容易出错。但是不要求CMake的交叉编译工具链,也就是说,我们随便在 CMake官网下载Linux版本就可以用了。
#!/bin/sh

# lib-name
MY_LIBS_NAME=libjpeg-turbo
# 源码文件目录
MY_SOURCE_DIR=$(pwd)/libjpeg-turbo-master
#编译的过程中产生的中间件的存放目录,为了区分编译目录,源码目录,install目录
MY_BUILD_DIR=binary

export PATH=/home/as/Android/cmake-3.12.1-Linux-x86_64/bin:$PATH

NDK_PATH=/home/as/Android/android-ndk-r15c
#构建平台,NDK里的目录名:Windows下为(windows-x86_64)
BUILD_PLATFORM=linux-x86_64
#工具链版本,推荐clang
TOOLCHAIN_VERSION=4.9
ANDROID_VERSION=24

ANDROID_ARMV5_CFLAGS="-march=armv5te"
ANDROID_ARMV7_CFLAGS="-march=armv7-a -mfloat-abi=softfp -mfpu=neon"  # -mfpu=vfpv3-d16  -fexceptions -frtti
ANDROID_ARMV8_CFLAGS="-march=armv8-a"  	# -mfloat-abi=softfp -mfpu=neon -fexceptions -frtti
ANDROID_X86_CFLAGS="-march=i386 -mtune=intel -mssse3 -mfpmath=sse -m32"
ANDROID_X86_64_CFLAGS="-march=x86-64 -msse4.2 -mpopcnt -m64 -mtune=intel"

# params($1:arch,$2:arch_abi,$3:host,$4:compiler,$5:cflags,$6:processor)
build_bin() {

    echo "-------------------star build $2-------------------------"

    ARCH=$1                # arm arm64 x86 x86_64
    ANDROID_ARCH_ABI=$2    # armeabi armeabi-v7a x86 mips
    # 最终编译的安装目录
    PREFIX=$(pwd)/dist/${MY_LIBS_NAME}/${ANDROID_ARCH_ABI}/
    HOST=$3
    COMPILER=$4
    PROCESSOR=$6
    SYSROOT=${NDK_PATH}/platforms/android-${ANDROID_VERSION}/arch-${ARCH}
    CFALGS="$5"
    TOOLCHAIN=${NDK_PATH}/toolchains/${HOST}-${TOOLCHAIN_VERSION}/prebuilt/${BUILD_PLATFORM}
    
    # build 中间件
    BUILD_DIR=./${MY_BUILD_DIR}/${ANDROID_ARCH_ABI}

    export CFLAGS="$5 -Os -D__ANDROID_API__=${ANDROID_VERSION} --sysroot=${SYSROOT} \
                   -isystem ${NDK_PATH}/sysroot/usr/include \
                   -isystem ${NDK_PATH}/sysroot/usr/include/${HOST} "
    export LDFLAGS=-pie

    echo "path==>$PATH"
    echo "build_dir==>$BUILD_DIR"
    echo "ARCH==>$ARCH"
    echo "ANDROID_ARCH_ABI==>$ANDROID_ARCH_ABI"
    echo "HOST==>$HOST"
    echo "CFALGS==>$CFALGS"
    echo "COMPILER==>$COMPILER-gcc"
    echo "PROCESSOR==>$PROCESSOR"

    mkdir -p ${BUILD_DIR}   #创建当前arch_abi的编译目录,比如:binary/armeabi-v7a
    cd ${BUILD_DIR}         #此处 进了当前arch_abi的2级编译目录

#运行时创建临时编译链文件toolchain.cmake
cat >toolchain.cmake << EOF 
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR $6)
set(CMAKE_C_COMPILER ${TOOLCHAIN}/bin/${COMPILER}-gcc)
set(CMAKE_FIND_ROOT_PATH ${TOOLCHAIN}/${COMPILER})
EOF # 此处不顶格写脚本会报一个错误

    cmake -G"Unix Makefiles" \
          -DCMAKE_TOOLCHAIN_FILE=toolchain.cmake \
          -DCMAKE_POSITION_INDEPENDENT_CODE=1 \
          -DCMAKE_INSTALL_PREFIX=${PREFIX} \
          -DWITH_JPEG8=1 \
          ${MY_SOURCE_DIR}

    make clean
    make
    make install

    #从当前arch_abi编译目录跳出,对应上面的cd ${BUILD_DIR},以便function多次执行
    cd ../../

    echo "-------------------$2 build end-------------------------"
}

# build armeabi
build_bin arm armeabi arm-linux-androideabi arm-linux-androideabi "$ANDROID_ARMV5_CFLAGS" arm

#build armeabi-v7a
build_bin arm armeabi-v7a arm-linux-androideabi arm-linux-androideabi "$ANDROID_ARMV7_CFLAGS" arm

#build arm64-v8a
build_bin arm64 arm64-v8a aarch64-linux-android aarch64-linux-android "$ANDROID_ARMV8_CFLAGS" aarch64

#build x86
build_bin x86 x86 x86 i686-linux-android "$ANDROID_X86_CFLAGS" i386

#build x86_64
build_bin x86_64 x86_64 x86_64 x86_64-linux-android "$ANDROID_X86_64_CFLAGS" x86_64
2.4.2.2 android-cmake(自带编译链)
注意
这个脚本要求Linux环境的Android-cmake,通过Android sdk-manager下载更新cmake, android-cmake已经自带交叉编译工具链,但通常我们不使用cmake带的,因为他脚本里写死了NDK版本12,而NDK的 build/cmake目录里也带了相应的编译链,所以,我们一般使用我们NDK自带的编译链。
#!/bin/bash

# lib-name
MY_LIBS_NAME=libjpeg-turbo
# 源码目录
MY_SOURCE_DIR=$(pwd)/libjpeg-turbo-master
MY_BUILD_DIR=binary

# android-cmake
CMAKE_PATH=/home/as/Android/cmake-3.6.4111459-linux-x86_64

export PATH=${CMAKE_PATH}/bin:$PATH

NDK_PATH=/home/as/Android/android-ndk-r15c
#构建平台,NDK里的目录名:Windows下为(windows-x86_64)
BUILD_PLATFORM=linux-x86_64
TOOLCHAIN_VERSION=4.9
ANDROID_VERSION=24

ANDROID_ARMV5_CFLAGS="-march=armv5te"
ANDROID_ARMV7_CFLAGS="-march=armv7-a -mfloat-abi=softfp -mfpu=neon"  # -mfpu=vfpv3-d16  -fexceptions -frtti
ANDROID_ARMV8_CFLAGS="-march=armv8-a "  			     # -mfloat-abi=softfp -mfpu=neon -fexceptions -frtti
ANDROID_X86_CFLAGS="-march=i386 -mtune=intel -mssse3 -mfpmath=sse -m32"
ANDROID_X86_64_CFLAGS="-march=x86-64 -msse4.2 -mpopcnt -m64 -mtune=intel"

# params($1:arch,$2:arch_abi,$3:host,$4:compiler,$5:cflags,$6:processor)
build_bin() {

    echo "-------------------start build $1-------------------------"

    ANDROID_ARCH_ABI=$1    # armeabi armeabi-v7a x86 mips
    CFALGS="$2"
    
    PREFIX=$(pwd)/dist/${MY_LIBS_NAME}/${ANDROID_ARCH_ABI}/
    # build 中间件
    BUILD_DIR=./${MY_BUILD_DIR}/${MY_LIBS_NAME}/${ANDROID_ARCH_ABI}

    echo "path==>$PATH"
    echo "build_dir==>$BUILD_DIR"
    echo "ANDROID_ARCH_ABI==>$ANDROID_ARCH_ABI"
    echo "CFALGS==>$CFALGS"

    mkdir -p ${BUILD_DIR}
    cd ${BUILD_DIR}

    # -DCMAKE_MAKE_PROGRAM=${NDK_PATH}/prebuilt/${BUILD_PLATFORM}/bin/make \
    # -DCMAKE_ASM_COMPILER=${NDK_PATH}/prebuilt/${BUILD_PLATFORM}/bin/yasm \

    cmake -G"Unix Makefiles" \
      -DANDROID_ABI=${ANDROID_ARCH_ABI} \
      -DANDROID_PLATFORM=android-${ANDROID_VERSION} \
      -DCMAKE_BUILD_TYPE=Release \
      -DANDROID_NDK=${NDK_PATH} \
      -DCMAKE_TOOLCHAIN_FILE=${NDK_PATH}/build/cmake/android.toolchain.cmake \
      -DCMAKE_POSITION_INDEPENDENT_CODE=1 \
      -DCMAKE_INSTALL_PREFIX=${PREFIX} \
      -DANDROID_ARM_NEON=TRUE \
      -DANDROID_TOOLCHAIN=clang \
      -DANDROID_STL=c++_static \
      -DCMAKE_C_FLAGS="${CFALGS} -Os -Wall -pipe -fPIC" \
      -DCMAKE_CXX_FLAGS="${CFALGS} -Os -Wall -pipe -fPIC" \
      -DANDROID_CPP_FEATURES=rtti exceptions \
      -DWITH_JPEG8=1 \
      ${MY_SOURCE_DIR}

    make clean
    make
    make install

    cd ../../../

    echo "-------------------$1 build end-------------------------"
}

# build armeabi
build_bin armeabi "$ANDROID_ARMV5_CFLAGS"

#build armeabi-v7a
build_bin armeabi-v7a "$ANDROID_ARMV7_CFLAGS"

#build arm64-v8a
build_bin arm64-v8a "$ANDROID_ARMV8_CFLAGS"

#build x86
build_bin x86 "$ANDROID_X86_CFLAGS"

#build x86_64
build_bin x86_64 "$ANDROID_X86_64_CFLAGS"

2.4.3 去掉版本号

动态库的版本号
  安装规则一般so都会带版本号,但是如果我们在Android上使用不带版本号。可以通过修改CMake脚本,不带版本号。

动态库实现版本号一般使用SET_TARGET_PROPERTIES指令定义一下语句:
  SET_TARGET_PROPERTIES(target PROPERTIES VERSION 1.2 SOVERSION 1)
VERSION 指代动态库版本,SOVERSION 指代 API 版本

  1. libjpeg-turbo-master/CMakeLists.txt中注释
    turbojpeg不使用版本号
  2. libjpeg-turbo-master/sharedlib/CMakeLists.txt中注释
    在这里插入图片描述

2.4.4 执行编译脚本

sh build.sh
编译执行
注释版本号编译
arm64-v8a
注释版本号
注释版本号message

2.4.5 编译可能遇到的问题

1. Syntax error: end of file unexpected (expecting "}")
编译脚本中 cat << EOF >文件名 内容 EOF,最好顶格写,否则可能出现上述错误
2.未识别的 cflags参数
一些cflags参数可能导致编译识别,修改编译出错的参数即可

2.4.6 install结果

编译目录

install目录

dist_libs

arm64_v8a
注释了版本号
注释掉版本号的编译


  1. 编译Android环境的libjpeg-turbo ↩︎

<think>嗯,用户想在Windows 10上用CMake 3.17编译libjpeg-turbo 1.5.3。首先,我需要回忆一下之前提供的引用内容,特别是引用[2]和引用[3],因为它们提到了Windows下的编译步骤。 用户需要的是特定版本的CMakelibjpeg-turbo,可能他们的项目需要兼容旧版本。首先,确保他们下载正确的libjpeg-turbo版本,1.5.3可能比较旧,官方可能已经不提供直接下载链接,可能需要通过GitHub的发布页面或者源码仓库获取。 然后,环境准备方面,用户需要安装Visual Studio 2019,因为引用[2]中使用了Visual Studio 16 2019的生成器。同时,CMake 3.17需要正确安装,并添加到系统路径中。可能还需要确认是否安装了Windows SDK和C++工具集。 接下来,CMake配置步骤。根据引用[2],生成命令应该是使用-G指定生成器,-A指定架构,这里用户可能需要x64或者ARM,但用户的问题中没有提到交叉编译,所以应该是x64。另外,安装路径可能需要用户自定义,比如-DCMAKE_INSTALL_PREFIX。 用户可能会遇到的问题包括生成器与CMake版本是否兼容。CMake 3.17支持Visual Studio 2019,但需要确认是否安装了对应的组件。另外,旧版本的libjpeg-turbo可能有不同的CMake配置选项,需要检查文档或CMakeLists.txt是否有特殊要求。 编译和安装步骤,用户需要打开生成的sln文件,选择Release配置,然后生成ALL_BUILD和INSTALL项目。这部分可能需要指导用户使用Visual Studio的界面操作,或者使用命令行,比如msbuild命令,这样更高效。 验证部分,用户需要检查输出目录是否有正确的库文件和头文件,可能需要测试一个示例程序来确认库是否正确链接。 另外,引用[3]提到了修改CMakeLists.txt添加SET(CMAKE_SYSTEM_PROCESSOR arm),但用户的问题中没有提到ARM架构,所以可能不需要这一步。但如果有用户需要交叉编译,可能需要额外说明,但当前问题应该集中在x64的编译上。 用户可能遇到的问题包括路径错误、缺少依赖项,或者编译时的权限问题,需要提醒用户以管理员身份运行Visual Studio或确保安装目录有写入权限。 最后,生成相关问题需要考虑用户可能的后续步骤,比如在Python中调用该库,或者如何处理编译中的常见错误,比如找不到jconfig.h等头文件,或者链接错误。</think>### 分步指南:Windows 10使用CMake 3.17编译libjpeg-turbo 1.5.3 #### 一、环境准备 1. **安装Visual Studio 2019** 需选择"使用C++的桌面开发"工作负载,包含MSVC编译器和Windows SDK[^2] 2. **下载libjpeg-turbo 1.5.3源码** 从GitHub Releases获取历史版本: ```bash https://github.com/libjpeg-turbo/libjpeg-turbo/releases/tag/1.5.3 ``` 3. **配置CMake 3.17环境变量** 确保`cmake.exe`所在路径已加入系统PATH #### 二、CMake配置 ```bash mkdir build cd build cmake -G "Visual Studio 16 2019" -A x64 ^ -DCMAKE_INSTALL_PREFIX="C:\libjpeg-turbo-1.5.3" ^ -DCMAKE_VERBOSE_MAKEFILE:BOOL=ON ^ .. ``` *参数说明*: - `-G` 指定生成Visual Studio 2019解决方案 - `-A x64` 生成64位架构工程 - `-DCMAKE_INSTALL_PREFIX` 设置自定义安装路径[^2] #### 三、编译与安装 1. 打开生成的`libjpeg-turbo.sln`解决方案 2. 在VS2019中: - 选择`Release`配置 - 右键生成`ALL_BUILD`项目 - 右键生成`INSTALL`项目(自动复制到指定目录) #### 四、验证输出 检查`C:\libjpeg-turbo-1.5.3`目录应包含: ``` ├─bin │ │ turbojpeg.dll ├─include │ │ jconfig.h │ │ jerror.h │ │ jmorecfg.h │ │ jpeglib.h │ │ turbojpeg.h └─lib │ turbojpeg.lib │ jpeg.lib │ turbojpeg-static.lib ```
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值