Mac下コンパイルLibjpegTurbo

5797 ワード

MacプラットフォームコンパイルLibjpegturboのメリット:
Windows、linux(Ubuntu)、macの下で異なる方法でコンパイルして、最後に実際にテストして、macプラットフォームの下で、cmake(非AS持参)でコンパイルする性能が一番いいです.
1.DebugとReleaseバージョンの違い:
debugは主にテストに使用され、releaseは主に正式バージョンに使用されます.理屈は同じですが、実際のテストの過程で、debugバージョンの性能は非常に悪く、Androidでの表現は原生の方法に及ばず、releaseバージョンの向上は非常に大きく、例えば、debugバージョンは1080 Pの画像を圧縮するのに150 msかかり、releaseバージョンは10-30 msしかかかりません.
 2.cmakeとasコンパイルの違い:
asはcmakeコンパイルツールを持っていて、10と6の2つの大きなバージョンしかありませんが、コンパイルされた考えの多くは理想的ではありません.性能が劣る.そこで、独自のコンパイルチェーンツールcmakeを選択し、shスクリプトコンパイルを作成しました.ASコンパイルの方法で私の前のいくつかの文章を見ることができて、以下はcmakeコンパイルだけを紹介します.
3.macでコンパイルする理由:
異なるプラットフォームの異なるツールの下でコンパイルした結果はすべて異なると述べた.macプラットフォームの下でコンパイルされた.soファイルは、携帯電話のcpu常用フレームv 8 aを例にとると、1080 P画像を1枚圧縮するのに10 msしかかかりませんが、他のプラットフォームでコンパイルするファイルは30 ms必要で、差は非常に大きいです.Windowsとlinuxを実測してもこの効果は得られません.
コンパイルの準備:
  • ソースコードのダウンロード、https://sourceforge.net/projects/libjpeg-turbo/推奨ダウンロード2.0.x最新バージョン
  • ndkダウンロードは、ndk 17以前はgccコンパイルをサポートしていたが、ndk 17以降はclangコンパイルがデフォルトであるため、ndk 16 bバージョンをダウンロードする.https://developer.android.google.cn/ndk/downloads/
  • cmakeツールとnasmツール、インストール方法は自分でチュートリアルを探してください.

  • ソースコードCmakelist.txt修正
    スクリプトを書く前に、ソースコードを少し修正する必要があります.主にバージョン番号を注釈します.そうしないと、コンパイルされます.soファイルにはわけのわからない接尾辞がありますよ?の
    最外層の主Cmakelist.text:
        set_target_properties(turbojpeg PROPERTIES
          SOVERSION ${TURBOJPEG_SO_MAJOR_VERSION} VERSION ${TURBOJPEG_SO_VERSION})

    sharelibフォルダの下のcmakelist.txt修正:
    set_target_properties(jpeg PROPERTIES SOVERSION ${SO_MAJOR_VERSION}
      VERSION ${SO_MAJOR_VERSION}.${SO_AGE}.${SO_MINOR_VERSION})

    以上の2箇所のコメントを見つけたり、直接削除したりすればいいです.次に、スクリプトファイルの作成を開始します.
    スクリプトファイルの作成:
    build.sh
    修正する必要があるのはndkパスで、16 bバージョンを使うことを考えています.
    #!/bin/bash
    
    #         
    if [ "$#" -lt 1 ]; then
    	THE_ARCH=armv7
    else
    	THE_ARCH=$(tr [A-Z] [a-z] <<< "$1")
    fi
    
    #           
    case "$THE_ARCH" in
    	arm|armv5|armv6|armv7|armeabi)
    		#     
    		# toolchain         
    		TOOLCHAIN_LEFT=arm-linux-androideabi
    		# android       
    		ANDROID_PLATFORMS=arm
    		# CMAKE_SYSTEM_PROCESSOR      
    		PROCESSOR_PLATFORMS=arm
    		# prebuilt          
    		TOOLCHAIN_PLEBUILT=arm-linux-androideabi
    		# include   
    		INCLUDE_PLATFORMS=arm-linux-androideabi
    		# CFLAGS      
    		CFLAGS_MARCH="-march=armv7-a -mfloat-abi=softfp -fprefetch-loop-arrays"
    		#      
    		BUILD_NAME=armeabi
    		;;
    	armv7a|armeabi-v7a)
    		#     
    		# toolchain         
    		TOOLCHAIN_LEFT=arm-linux-androideabi
    		# android       
    		ANDROID_PLATFORMS=arm
    		# CMAKE_SYSTEM_PROCESSOR      
    		PROCESSOR_PLATFORMS=arm
    		# prebuilt          
    		TOOLCHAIN_PLEBUILT=arm-linux-androideabi
    		# include   
    		INCLUDE_PLATFORMS=arm-linux-androideabi
    		# CFLAGS      
    		CFLAGS_MARCH="-march=armv7-a -mfloat-abi=softfp -fprefetch-loop-arrays"
    		BUILD_NAME=armeabi-v7a
    		;;
    	armv8|armv8a|aarch64|arm64|arm64-v8a)
    		#     
    		# toolchain         
    		TOOLCHAIN_LEFT=aarch64-linux-android
    		# android       
    		ANDROID_PLATFORMS=arm64
    		# CMAKE_SYSTEM_PROCESSOR      
    		PROCESSOR_PLATFORMS=aarch64
    		# prebuilt          
    		TOOLCHAIN_PLEBUILT=aarch64-linux-android
    		# include   
    		INCLUDE_PLATFORMS=aarch64-linux-android
    		# CFLAGS      
    		CFLAGS_MARCH=""
    		BUILD_NAME=arm64-v8a
    		;;
    	x86)
    		#     
    		# toolchain         
    		TOOLCHAIN_LEFT=x86
    		# android       
    		ANDROID_PLATFORMS=x86
    		# CMAKE_SYSTEM_PROCESSOR      
    		PROCESSOR_PLATFORMS=x86
    		# prebuilt          
    		TOOLCHAIN_PLEBUILT=i686-linux-android
    		# include   
    		INCLUDE_PLATFORMS=i686-linux-android
    		# CFLAGS      
    		CFLAGS_MARCH=""
    		BUILD_NAME=x86
    		;;
    	x86_64|x64)
    		#     
    		# toolchain         
    		TOOLCHAIN_LEFT=x86_64
    		# android       
    		ANDROID_PLATFORMS=x86_64
    		# CMAKE_SYSTEM_PROCESSOR      
    		PROCESSOR_PLATFORMS=x86_64
    		# prebuilt          
    		TOOLCHAIN_PLEBUILT=x86_64-linux-android
    		# include   
    		INCLUDE_PLATFORMS=x86_64-linux-android
    		# CFLAGS      
    		CFLAGS_MARCH=""
    		BUILD_NAME=x86_64
    		;;
    esac
    #     
    #ndk    
    NDK_PATH=/Users/alexlu/Desktop/ndk/android-ndk-r16b
    #        macOS
    BUILD_PLATFORM=darwin-x86_64
    #       
    TOOLCHAIN_VERSION=4.9
    #    
    ANDROID_VERSION=21
    
    #     
    SYSROOT=${NDK_PATH}/platforms/android-${ANDROID_VERSION}/arch-${ANDROID_PLATFORMS}
    export CFLAGS="${CFLAGS_MARCH} -D__ANDROID_API__=${ANDROID_VERSION} --sysroot=${SYSROOT} \
      -isystem ${NDK_PATH}/sysroot/usr/include \
      -isystem ${NDK_PATH}/sysroot/usr/include/${INCLUDE_PLATFORMS}"
    export LDFLAGS=-pie
    TOOLCHAIN=${NDK_PATH}/toolchains/${TOOLCHAIN_LEFT}-${TOOLCHAIN_VERSION}/prebuilt/${BUILD_PLATFORM}
    
    #             
    mkdir -p ${BUILD_NAME}
    
    cd ${BUILD_NAME}
    cat <toolchain.cmake
    set(CMAKE_SYSTEM_NAME Linux)
    set(CMAKE_SYSTEM_PROCESSOR ${ANDROID_PLATFORMS})
    set(CMAKE_C_COMPILER ${TOOLCHAIN}/bin/${TOOLCHAIN_PLEBUILT}-gcc)
    set(CMAKE_FIND_ROOT_PATH ${TOOLCHAIN}/${TOOLCHAIN_PLEBUILT})
    EOF
    
    cmake -G"Unix Makefiles" -DCMAKE_TOOLCHAIN_FILE=toolchain.cmake \
    	-DCMAKE_POSITION_INDEPENDENT_CODE=1 \
    	../libjpeg-turbo #         
    
    make clean
    make
    make install

    build_all.sh
    主に各フレームをすべて実行します.
    for arch in armeabi armeabi-v7a arm64-v8a x86 x86_64
    do
    	bash build.sh $arch
    done

    以上のスクリプトの作成が完了しました.次の手順に従います.
  • ソースディレクトリをlibjpeg_に変更turbo(shスクリプトに対応すればいい)
  • デスクトップにtestフォルダを新規作成し、ソースコードlibjpeg-turboフォルダと2つのスクリプトファイルを入れます.
  • 端末を開く、
    1.cd desktop/test
    
    2.sudo sh build_all.sh
    
          (mac linux         ?)
    または:
    1. cd desktop/test
    
    2. chmod 777 build_all.sh
    
    3. ./build_all.sh
  • を実行する.
  • コンパイルの完了を待つ
  • .
    エラー解決、コンパイル中によく奇妙な問題に遭遇し、霧の水になる可能性があります.最善の解決策はlogログを見て、cmakelisterror.logまたはcmakeoutput.logでは問題の根源をよく調べることができます.
     
    最後に私がコンパイルしたファイルを添付します.https://download.csdn.net/download/qq_36332133/11676292