Windows下編譯libjpeg-turbo(CMake項(xiàng)目)供Windows,Android使用

1.前言

本文以libjpeg-turbo
為例,他是一個cmake項(xiàng)目,之前他是一個autoconf項(xiàng)目,需要使用其他方式來編譯,將 NDK 與其他構(gòu)建系統(tǒng)配合使用,如果網(wǎng)友有興趣,以后有可能寫。
前提準(zhǔn)備,需要安裝Windows = {cmake,nasm,MinGW},Android = {cmake(Android SDK中的),NDK,MSYS2},安裝方法網(wǎng)上一大堆,這里不再贅述,默認(rèn)大家都會[doge],注:大家下載的時候下載電腦對應(yīng)的版本,e.g. 64位下載x86_64。

2.編譯Windows自用

這個算是最簡單的。
參考:

Windows上編譯libjpeg-turbo
mingw編譯opencv動態(tài)鏈接庫和靜態(tài)鏈接庫及使用方法

  • 打開cmake-gui在安裝位置的bin目錄下
  • 配置代碼地址,以及中間件的生成位置,一般是在項(xiàng)目中新建build文件,這里可以直接追加build,cmake會自動創(chuàng)建。


    導(dǎo)入項(xiàng)目
  • 點(diǎn)擊左下角的Configure,配置使用MinGW編譯


    image.png
  • 等待cmake運(yùn)行完成后,可以看到讀取CMakeLists.txt生成的配置項(xiàng),這里勾選WITH_JPEG8,注意其中有一項(xiàng)是CMAKE_INSTALL_PREFIX,他是最終生成庫的目錄,記下,修改完成此時并沒有完成,需要再次點(diǎn)擊Configure,讓紅色消失,最后點(diǎn)擊Configure旁邊的的Generate來生成中間件。
    配置
  • 接下來我們進(jìn)入build目錄可以看到CMakeCache.txt,以及CMakeFiles等,在這里shift+右鍵打開控制臺,輸入mingw32-make使用MinGW編譯。
  • 這一步很重要,很多人在博文中都沒有提及,編譯完成后還需要安裝,接著執(zhí)行mingw32-make install,還記得上文提到的CMAKE_INSTALL_PREFIX么,我們在他對應(yīng)的目錄下找到編譯好的庫。其中include和lib是我們需要的。
    安裝位置

    三方庫

3.編譯Android版本

比較復(fù)雜,經(jīng)過自己多次嘗試,在Windows環(huán)境下,只能使用Windows版本的cmake來編譯,因?yàn)閍ndroid.toolchain.cmake會根據(jù)cmake的屬性來確定編譯器,使用MSYS中的cmake,始終不能成功,或許可以但是本人還不會。如果nb的網(wǎng)友知道,可以告訴鄙人。
大家如果使用Android Studio可以看看.cxx/debug/{abi}/build_command這個文件會有啟發(fā)。
參考(大致都一樣[doge],但是有幾個細(xì)節(jié)需要注意,下文會提到):

編譯Android環(huán)境的libjpeg-turbo使用cmake
Android-JNI開發(fā)系列《十》實(shí)踐利用libjpeg-turbo完美壓縮圖片不失真

介紹在MSYS2下執(zhí)行,shell腳本,命令同Linux

# lib-name
MY_LIBS_NAME=libjpeg-turbo 
# 當(dāng)前位置
base=$(cd `dirname $0`; pwd)
# 代碼位置
MY_SOURCE_DIR=${base}/libjpeg-turbo
# 編譯結(jié)果位置
MY_BUILD_DIR=libjpeg-turbo_install

# export PATH=${CMAKE_PATH}/bin:$PATH
# ndk位置
ANDROID_NDK=/d/Compiler/ndk/21.4.7075529
# cmake位置
CMAKE_PATH=/d/Compiler/cmake/3.10.2.4988404

# 運(yùn)行平臺
BUILD_PLATFORM=windows-x86_64
TOOLCHAIN_VERSION=4.9
# 安卓最低版本
ANDROID_VERSION=21

# cpu flags
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=i686 -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-------------------------"

    # cpu架構(gòu)
    ANDROID_ARCH_ABI=$1    # armeabi armeabi-v7a x86 mips
    CFLAGS="$2"
    
    # 生成庫位置
    LIB_OUTPUT_DIR=${base}/${MY_BUILD_DIR}/lib/${ANDROID_ARCH_ABI}
    # build 中間件
    BUILD_DIR=${base}/${MY_BUILD_DIR}/bin/${ANDROID_ARCH_ABI}

    # echo "path==>$PATH"
    echo "MY_SOURCE_DIR==>$MY_SOURCE_DIR"
    echo "build_dir==>$BUILD_DIR"
    echo "ANDROID_ARCH_ABI==>$ANDROID_ARCH_ABI"
    echo "CFLAGS==>$CFLAGS"


    mkdir -p ${BUILD_DIR}
    # cd到build位置
    cd ${BUILD_DIR}
    # -DCMAKE_MAKE_PROGRAM=${ANDROID_NDK}/prebuilt/${BUILD_PLATFORM}/bin/make \
    # -DCMAKE_ASM_COMPILER=${ANDROID_NDK}/prebuilt/${BUILD_PLATFORM}/bin/yasm \

    # cmake -G"Unix Makefiles" \
    # -DCMAKE_MAKE_PROGRAM=${CMAKE_PATH}/bin/ninja.exe \
    # -G"Ninja" \

    # -DCMAKE_C_COMPILER=${ANDROID_NDK}/toolchains/llvm/prebuilt/${BUILD_PLATFORM}/bin/armv7a-linux-androideabi21-clang \

    # -DCMAKE_LIBRARY_OUTPUT_DIRECTORY=${LIB_OUTPUT_DIR}/lib \
    # -DCMAKE_ARCHIVE_OUTPUT_DIRECTORY=${LIB_OUTPUT_DIR}/lib \
    
    # DCMAKE_INSTALL_PREFIX生成的庫安裝目錄
    # DCMAKE_TOOLCHAIN_FILE工具鏈地址
    # DCMAKE_MAKE_PROGRAM make工具
    # DANDROID_ABI cpu架構(gòu)
    # DANDROID_PLATFORM 最低android版本
    # DANDROID_TOOLCHAIN 工具鏈編輯編譯器
    # DWITH_JPEG8 編譯jpeg8

    ${CMAKE_PATH}/bin/cmake \
        -DCMAKE_INSTALL_PREFIX=${LIB_OUTPUT_DIR} \
        -DCMAKE_BUILD_TYPE=Release \
        -DCMAKE_POSITION_INDEPENDENT_CODE=1 \
        -DCMAKE_TOOLCHAIN_FILE=${ANDROID_NDK}/build/cmake/android.toolchain.cmake \
        -DCMAKE_MAKE_PROGRAM=${CMAKE_PATH}/bin/ninja.exe \
        -G"Ninja" \
        -DANDROID_ABI=${ANDROID_ARCH_ABI} \
        -DANDROID_PLATFORM=android-${ANDROID_VERSION} \
        -DCMAKE_C_FLAGS="${CFLAGS} -Os -Wall -pipe -fPIC" \
        -DANDROID_NDK=${ANDROID_NDK} \
        -DANDROID_ARM_NEON=TRUE \
        -DANDROID_TOOLCHAIN=clang \
        -DANDROID_STL=c++_shared \
        -DANDROID_CPP_FEATURES=rtti exceptions \
        -DWITH_JPEG8=1 \
        ${MY_SOURCE_DIR}
        
    # 使用cmake 編譯
    ${CMAKE_PATH}/bin/cmake --build ./
    
    # 使用ninja安裝
    # ${CMAKE_PATH}/bin/ninja clean
    # ${CMAKE_PATH}/bin/ninja
    ${CMAKE_PATH}/bin/ninja install

    cd ../../../

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

# 放開對應(yīng)的架構(gòu)以使用
# 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"

注意的點(diǎn):

  • 代碼文件夾和shell腳本在同級目錄
  • 我們使用MSYS2外部的NDK來編譯,所有執(zhí)行命令的工具都指向外部
  • ${CMAKE_PATH}/bin/cmake --build ./ 如果只執(zhí)行到這里是得不到需要的三方庫,還要使用ninja安裝
# 使用ninja安裝
${CMAKE_PATH}/bin/ninja install
  • 上文的腳本只開啟了x86的編譯,如果需要可以自行修改
    提一下直接使用.bat批處理也是可以的,可以參考

Windows環(huán)境下編譯Android平臺的libyuv

注意的點(diǎn):這個腳本拿來改一改里面的目錄就可以用了;需要注意里面沒有install命令,需要各位聰明的網(wǎng)友在腳本末尾參考上文shell腳本添加ninja命令。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容