精华内容
下载资源
问答
  • I . Ubuntu 中交叉编译 Android 动态库 II . Ubuntu 中交叉编译 Android 静态库



    I . Ubuntu 中交叉编译 Android 动态库



    1 . 要编译的源文件 : add.c 源文件 ;

    #include <stdio.h>
    
    int add(int a, int b){
    	return a + b;
    }
    

    2 . 共享动态库编译参数 : 编译动态库需要添加 -fPIC“-shared两个参数 ;


    3 . 编译命令 :


    ① 设置 编译器 临时环境变量 :

    export CC=/root/NDK/android-ndk-r17c/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc


    ② 设置指定 头文件和函数库 的临时环境变量 :

    export HEAD_LIB="--sysroot=/root/NDK/android-ndk-r17c/platforms/android-21/arch-arm -isystem /root/NDK/android-ndk-r17c/sysroot/usr/include -isystem /root/NDK/android-ndk-r17c/sysroot/usr/include/arm-linux-androideabi"


    ③ 最终命令 :

    $CC $HEAD_LIB -fPIC -shared add.c -o libadd.so


    4 . 编译结果 : 在该目录下生成了 libadd.so 动态库 ;

    在这里插入图片描述

    root@octopus:~/NDK/001_Compile# ls
    add.c
    root@octopus:~/NDK/001_Compile# export CC=/root/NDK/android-ndk-r17c/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc
    root@octopus:~/NDK/001_Compile# 
    root@octopus:~/NDK/001_Compile# export HEAD_LIB="--sysroot=/root/NDK/android-ndk-r17c/platforms/android-21/arch-arm -isystem /root/NDK/android-ndk-r17c/sysroot/usr/include -isystem /root/NDK/android-ndk-r17c/sysroot/usr/include/arm-linux-androideabi"
    root@octopus:~/NDK/001_Compile# 
    root@octopus:~/NDK/001_Compile# $CC $HEAD_LIB -fPIC -shared add.c -o libadd.so
    root@octopus:~/NDK/001_Compile# 
    root@octopus:~/NDK/001_Compile# ls
    add.c  libadd.so
    root@octopus:~/NDK/001_Compile# 
    

    目录中的 libadd.so 就是编译完成的动态库 , 该动态库可以放到 Android Studio 项目中使用 ;



    II . Ubuntu 中交叉编译 Android 静态库



    1 . 要编译的源文件 : add.c 源文件 ;

    #include <stdio.h>
    
    int add(int a, int b){
    	return a + b;
    }
    

    2 . 共享动态库编译参数 : 编译动态库需要添加 -fPIC参数 , 先输出 .o 文件 , 然后 根据 .o 文化生成 静态库 ;


    3 . 编译命令 :


    ① 设置 arm-linux-androideabi-gcc 交叉编译器 临时环境变量 : 用于生成 .o 文件 ;

    export CC=/root/NDK/android-ndk-r17c/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc


    ② 设置 arm-linux-androideabi-ar 工具 临时环境变量 : 使用 .o 文件生成静态库 ;

    export AR=/root/NDK/android-ndk-r17c/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-ar


    ② 设置指定 头文件和函数库 的临时环境变量 :

    export HEAD_LIB="--sysroot=/root/NDK/android-ndk-r17c/platforms/android-21/arch-arm -isystem /root/NDK/android-ndk-r17c/sysroot/usr/include -isystem /root/NDK/android-ndk-r17c/sysroot/usr/include/arm-linux-androideabi"


    ③ 最终命令 :

    $CC $HEAD_LIB -fPIC -c add.c -o add.o

    $AR r libadd.a add.o

    4 . 编译结果 : 在该目录下生成了 libadd.a 静态库 ;

    在这里插入图片描述

    root@octopus:~/NDK/001_Compile# ls
    add.c  libadd.so
    root@octopus:~/NDK/001_Compile# export CC=/root/NDK/android-ndk-r17c/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc
    root@octopus:~/NDK/001_Compile# 
    root@octopus:~/NDK/001_Compile# export AR=/root/NDK/android-ndk-r17c/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-ar
    root@octopus:~/NDK/001_Compile# 
    root@octopus:~/NDK/001_Compile# export HEAD_LIB="--sysroot=/root/NDK/android-ndk-r17c/platforms/android-21/arch-arm -isystem /root/NDK/android-ndk-r17c/sysroot/usr/include -isystem /root/NDK/android-ndk-r17c/sysroot/usr/include/arm-linux-androideabi"
    root@octopus:~/NDK/001_Compile# 
    root@octopus:~/NDK/001_Compile# $CC $HEAD_LIB -fPIC -c add.c -o add.o
    root@octopus:~/NDK/001_Compile# 
    root@octopus:~/NDK/001_Compile# $AR r libadd.a add.o
    /root/NDK/android-ndk-r17c/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-ar: creating libadd.a
    root@octopus:~/NDK/001_Compile# 
    root@octopus:~/NDK/001_Compile# ls
    add.c  add.o  libadd.a  libadd.so
    root@octopus:~/NDK/001_Compile# 
    root@octopus:~/NDK/001_Compile# 
    
    展开全文
  • 一、交叉编译 Shell 脚本参考、 二、NDK r16b 版本配置、 三、libjpeg-turbo 交叉编译 Shell 脚本、 四、执行 libjpeg-turbo 交叉编译 Shell 脚本 开始编译、 五、拷贝函数库头文件到 Android Studio、 六、Android ...





    一、交叉编译 Shell 脚本参考



    交叉编译脚本参考 : 之前已经做过两个函数库的交叉编译脚本 , FFMPEGx264 开源库 , 而且都是使用 configure 生成 Makefile 文件 ;


    ① FFMPEG 函数库的交叉编译脚本 : 【Android FFMPEG 开发】FFMPEG 交叉编译配置 ( 下载 | 配置脚本 | 输出路径 | 函数库配置 | 程序配置 | 组件配置 | 编码解码配置 | 交叉编译配置 | 最终脚本 ) 十一、交叉编译配置 Shell 脚本 ( 重点 )

    ② x264 函数库的交叉编译脚本 : 【Android RTMP】Android Studio 集成 x264 开源库 ( Ubuntu 交叉编译 | Android Studio 导入函数库 ) 二、 x264 交叉编译

    参考上述交叉编译脚本 , 编写 libjpeg-turbo 函数库 的交叉编译脚本 ; ( 上述编译脚本仅做参考 )


    发现 libjpeg-turbo 源码路径下的 BUILDING.md 文件中有预置好的交叉编译脚本示例 ;





    二、NDK r16b 版本配置



    NDK 配置 : 交叉编译 libjpeg-turbo 只能使用 NDK r16b 或者之前的版本 , 这里使用 r16b 版本 ;


    ① NDK 官方主页 : 点击该链接进入界面

    ② NDK 下载地址 : 点击该链接进入界面

    ③ 停止维护版本下载地址 : 旧版本 NDK 下载地址 , 这里在该地址中下载 Android NDK,修订版 16b(2017 年 12 月)版本 , 编译要求使用 NDK r16b 或者之前的版本 ;

    ④ 直接下载地址 : android-ndk-r16b-linux-x86_64.zip , 这是 Linux 64 位 NDK 下载地址 ;





    三、libjpeg-turbo 交叉编译 Shell 脚本



    1. 需要配置的选项 :


    ① NDK 路径 : /root/NDK/android-ndk-r16b , 将 NDK 下载后 , 解压的路径 ;

    ② 交叉编译工具链 : gcc , 官方让在 gcc , g++ , clang 中三选一 ; 这是 C 语言项目 , 选择 gcc 即可 ;

    ③ 最低 Android 版本 : 16 即可 , 基本没有低于 16 版本的手机 ;

    ④ 编译结果输出目录 : /root/picture_compress/libjpeg-turbo-2.0.5/android

    ⑤ 源文件目录 : /root/picture_compress/libjpeg-turbo-2.0.5



    2. 替换上述配置 , 生成下面的配置文件 :

    # 设置 NDK 的目录 , 这里使用 ndk-r16b 版本
    NDK_PATH=/root/NDK/android-ndk-r16b
    
    # 设置 NDK 的交叉编译工具链 , 这里特别注明 , 只能使用 NDK r16b 或者之前的版本 
    TOOLCHAIN=gcc
    
    # Android 的最低兼容版本 
    ANDROID_VERSION=16
    
    # 进入最终编译生成编译结果目录
    cd /root/picture_compress/libjpeg-turbo-2.0.5/android
    
    # 设置 源码目录 最后的 /root/picture_compress/libjpeg-turbo-2.0.5 就是源文件所在目录
    cmake -G"Unix Makefiles" \
      -DANDROID_ABI=armeabi-v7a \
      -DANDROID_ARM_MODE=arm \
      -DANDROID_PLATFORM=android-${ANDROID_VERSION} \
      -DANDROID_TOOLCHAIN=${TOOLCHAIN} \
      -DCMAKE_ASM_FLAGS="--target=arm-linux-androideabi${ANDROID_VERSION}" \
      -DCMAKE_TOOLCHAIN_FILE=${NDK_PATH}/build/cmake/android.toolchain.cmake \
      /root/picture_compress/libjpeg-turbo-2.0.5
    make
    




    四、执行 libjpeg-turbo 交叉编译 Shell 脚本 开始编译



    1. 创建编译脚本 : 在 /root/picture_compress/libjpeg-turbo-2.0.5 目录下创建 build.sh , 将上述 交叉编译 Shell 脚本信息拷贝到该文件中 ;


    2. 修改权限 , 然后执行编译脚本 :

    $ chmod -R 777 build.sh
    $ ./build.sh
    


    3. 生成的静态库与头文件查看 : 服了 , 编译后的结果都散的 , 不像 FFMPEG , x264 等 , 编译后 , 头文件都在 include 中 , 静态库 动态库都整整齐齐的放在对应文件中 ;


    ① 静态库 : 静态库在 /root/picture_compress/libjpeg-turbo-2.0.5/android 目录中生成 ;

    ② 头文件 : 需要自己去源码中找头文件 , 有些在 /root/picture_compress/libjpeg-turbo-2.0.5/android 目录中 , 有些在 /root/picture_compress/libjpeg-turbo-2.0.5/ 目录中 , 下图中画红框的拷贝出来 ;

    ③ 项目里扒 : 嫌麻烦的直接从 GitHub 中的 PictureCompress 项目 里面扒也可以 ;

    在这里插入图片描述





    五、拷贝函数库头文件到 Android Studio



    1. 拷贝静态库 : 将上述函数库 libturbojpeg.a 拷贝到 src/main/cpp/libs/armeabi-v7a 目录中 ;


    2. 拷贝头文件 : 将上述 jconfig.h , jerror.h , jmorecfg.h , jpeglib.h , turbojpeg.h 头文件拷贝到 src/main/cpp/include 目录中 ;


    3. 拷贝结果展示 :

    在这里插入图片描述





    六、Android Studio 工程配置 CMakeLists.txt 构建脚本



    配置构建脚本 : 配置 src/main/cpp/CMakeLists.txt 构建脚本 ;

    cmake_minimum_required(VERSION 3.4.1)
    
    add_library( # 函数库名称
            native-lib
            # 动态库类型
            SHARED
            # 源文件
            native-lib.cpp)
    
    find_library( # 日志库
            log-lib
            log )
    
    find_library( # JNI 图形库
            jnigraphics-lib
            jnigraphics )
    
    # 设置头文件搜索路径
    include_directories(include)
    
    # 通过设置编译选项, 设置函数库的搜索路径
    # 此处的 ANDROID_ABI 是在
    # build.gradle android->defaultConfig->externalNativeBuild->cmake
    # 下的 abiFilters 中设置
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -L${CMAKE_SOURCE_DIR}/libs/${ANDROID_ABI}")
    
    target_link_libraries( # 链接动态库
            native-lib
    
            # 查找到的 libturbojpeg 静态库
            turbojpeg
    
            ${log-lib}
            ${jnigraphics-lib} )
    




    七、Android Studio 工程配置 build.gradle 构建脚本



    在 build.gradle 构建脚本中主要注意两个配置选项 :


    ① ARM 函数库的 CPU 架构 : abiFilters ‘armeabi-v7a’

    ② C/C++ 代码及函数库的构建脚本 : path “src/main/cpp/CMakeLists.txt”

    apply plugin: 'com.android.application'
    
    android {
        compileSdkVersion 29
    
        defaultConfig {
            applicationId "kim.hsl.pc"
            minSdkVersion 16
            targetSdkVersion 29
            versionCode 1
            versionName "1.0"
    
            testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    
            externalNativeBuild {
                cmake {
                    cppFlags ""
                    abiFilters 'armeabi-v7a'
                }
            }
        }
    
        buildTypes {
            release {
                minifyEnabled false
                proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
            }
        }
    
        externalNativeBuild {
            cmake {
                path "src/main/cpp/CMakeLists.txt"
                //version "3.10.2"
            }
        }
    }
    
    dependencies {
        implementation fileTree(dir: 'libs', include: ['*.jar'])
    
        implementation 'androidx.appcompat:appcompat:1.1.0'
        implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
        testImplementation 'junit:junit:4.12'
        androidTestImplementation 'androidx.test.ext:junit:1.1.1'
        androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
    }
    
    




    八、测试 libjpeg-turbo 函数库



    在 native-lib.cpp 代码中 , 使用 libturbojpeg.a 函数库中的结构体 , 看是否可以使用 ;

    #include <jni.h>
    #include <string>
    #include <jpeglib.h>
    #include <android/bitmap.h>
    #include <malloc.h>
    #include <android/log.h>
    #include <bitset>
    #include <iosfwd>
    
    extern "C" JNIEXPORT jstring JNICALL
    Java_kim_hsl_pc_MainActivity_stringFromJNI(
            JNIEnv* env,
            jobject /* this */) {
        std::string hello = "Hello from C++";
    
        // 测试 libturbojpeg.a 函数库
        jpeg_compress_struct jcs;
        __android_log_print(ANDROID_LOG_INFO, "JPEG", "jpeg_compress_struct jcs = %d", jcs.image_width);
        hello = hello + " , jpeg_compress_struct jcs = " + std::to_string(jcs.image_width);
        
        return env->NewStringUTF(hello.c_str());
    }
    

    在这里插入图片描述

    经测试函数库可用 ;

    展开全文
  • I . NDK platforms 目录下的 函数库 II . Ubuntu 配置 NDK 交叉编译环境 III . 同时指定编译的头文件和库文件 IV . 指定编译的头文件 V . 指定编译的库文件 VI . 指定编译的头文件与库文件 示例



    I . NDK platforms 目录下的 函数库



    platforms 目录下的函数库:


    1 . Android 版本目录 : platforms 中存储了各个 Android 版本编译时需要的动态库与静态库资源 , 如 android-29 中就是该版本对应的本地库资源 ;

    在这里插入图片描述


    2 . CPU 架构目录 :

    在版本目录下存储的是不同的 CPU 处理器对应的库版本 , 如 arm , x86 处理器 , 32 位 与 64 位 等不同版本对应的本地库 ;

    CPU 不同 , 其对应的指令集不同 , 相应编译出的动态库或静态库就不同 ;

    在这里插入图片描述

    3 . 函数库目录 :


    在对应 CPU 目录下的 usr\lib 目录下 , 存储了该 Android 版本对应的 CPU 版本的动态库 与 静态库 ;

    开发高性能音频时使用的 libOpenSLES.so , 打印日志使用的 liblog.so 库 , 就是在该目录下 ; 引入的 #include <android/log.h> 头文件对应的方法逻辑实现就在 liblog.so 库中 ;

    在这里插入图片描述



    II . Ubuntu 配置 NDK 交叉编译环境



    独立使用 NDK 提供的交叉编译工具 , 需要在 Ubuntu Linux 下执行 , 因此这里我们下载 Linux 版本的 NDK ;


    1 . NDK 下载地址 : https://developer.android.google.cn/ndk/downloads

    历史版本的 NDK 下载地址 : https://developer.android.google.cn/ndk/downloads/older_releases.html


    2 . 下载完毕会后在 Ubuntu 中解压文件 :
    在这里插入图片描述


    3 . 配置临时环境变量 :


    ① 目的 : 该临时环境变量 就是 NDK 中的交叉编译工具的路径 , 目的是方便调用 ;


    ② 执行指令 : export CC=/home/book/NDK/android-ndk-r17c/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc


    ③ CC 环境变量作用 : CC 是变量名 , 调用的时候使用 $CC main.c 即可调用上述路径中的 arm-linux-androideabi-gcc 工具编译 main.c 源文件 ;


    ④ 交叉编译 : 上述路径的编译器就是在 Linux 中编译 ARM CPU 指令集的函数库 , 由于是在 X86 芯片上编译 ARM 芯片的函数库 , 因此该操作叫做交叉编译 ;


    4 . 尝试交叉编译 :

    ① main.c 源文件 :

    #include <stdio.h>
    
    int main(){
    	printf("main : test");
    	return 0;
    }
    

    ② 尝试编译 : 调用 $CC main.c 命令尝试编译 main.c 程序 , 发现如下问题 ;

    book@book-virtual-machine:~/NDK$ $CC main.c 
    main.c:1:19: fatal error: stdio.h: No such file or directory
     #include <stdio.h>
                       ^
    compilation terminated.
    book@book-virtual-machine:~/NDK$ 
    
    

    ③ 分析原因 : 此处需要提供 stdio.h 对应的头文件与函数库 , 上面连头文件都没有找到 , 需要我们来指定 ;


    下面开始说明如何指定头文件与库文件 ;



    III . 同时指定编译的头文件和库文件



    1 . 库文件 : 交叉编译需要的库文件就是上述 NDK platforms 目录下的 函数库 ;


    2 . --sysroot 头文件与库文件查找目录设定 : 使用 --sysroot=XX 参数设置 ;

    指定本次编译的 头文件 与 库文件 , 系统会自动到 XX/usr/include 目录下查找头文件 , 到 XX/usr/lib 目录下查找库文件 ;



    IV . 指定编译的头文件



    1 . -isysroot 头文件查找目录设定 : 使用 -isysroot YY 参数设置 ;

    指定头文件查找目录 , 系统还会自动到 YY/usr/include 目录下查找头文件 ;

    注意 : 该配置会覆盖 --sysroot=XX 参数查找头文件的配置 ;


    2 . 同时设置 --sysroot=XX -isysroot=YY 情况 :


    如果同时设置了 --sysroot=XX -isysroot=YY 两个参数 ,

    会去 XX/usr/lib 目录下找库文件 ,
    到 YY/usr/include 目录下查找头文件 ;

    ( 此时不再去 XX/usr/include 目录下查找头文件 )


    3 . -isystem 设置头文件查找路径 : 使用 -isystem ZZ 参数设置 ;

    设置后系统会直接去 ZZ 目录下查找头文件 ;


    4 . -isysroot 与 -isystem 区别 :


    两种参数配置的查找路径不同 ,

    -isysroot 设定会去设定的目录下的 usr/include 目录下查找 .

    -isystem 会直接到设置的目录下查找 ;


    5 . -I 头文件查找目录 : 使用 -isystem KK 参数设置 ;

    设置后系统会直接去 KK 目录下查找头文件 ;


    6 . 头文件目录查找优先级 :

    优先级从高到底 : -I > -isystem > -isysroot



    V . 指定编译的库文件



    1 . -L 指定库文件查找目录 : 使用 -L AA 参数设置 ;

    设置该参数后 , 编译时系统会自动到 AA 目录下查找函数库 ;


    2 . -l 指定链接的库名称 : 使用 -l libxxx.so 参数设置 ;

    设置该参数后 , 系统会按照该路径加载该 libxxx.so 函数库 ;



    VI . 指定编译的头文件与库文件 示例



    1 . 设置临时环境变量 :

    export CC=/home/book/NDK/android-ndk-r17c/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc


    2 . NDK 头文件与库文件的目录 :
    ( 这里以 android-21 版本 ARM CPU 为例 )


    ① NDK 库文件目录 :

    /home/book/NDK/android-ndk-r17c/platforms/android-21/arch-arm/user/lib


    ② NDK 库头文件目录 :

    /home/book/NDK/android-ndk-r17c/sysroot/usr/include

    /home/book/NDK/android-ndk-r17c/sysroot/usr/include/arm-linux-androideabi/asm


    3 . 最终的指定头文件与函数库的编译指令 :


    $CC --sysroot=/home/book/NDK/android-ndk-r17c/platforms/android-21/arch-arm -isystem /home/book/NDK/android-ndk-r17c/sysroot/usr/include -isystem /home/book/NDK/android-ndk-r17c/sysroot/usr/include/arm-linux-androideabi -pie main.c


    命令解析 :


    $CC : arm-linux-androideabi-gcc 交叉编译工具的临时环境变量 , 执行 $CC 相当于执行 /home/book/NDK/android-ndk-r17c/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc 命令 ;

    ② 指定函数库 :

    –sysroot=/home/book/NDK/android-ndk-r17c/platforms/android-21/arch-arm

    指定函数库目录 , 必须这么写 , 因为真正要查找的是下层目录中的 usr/lib 目录 ;


    ③ 指定头文件 : 这里使用的是 -isystem , 不是 -isysroot , 因此目录可以写的随意一些 ;


    -isystem /home/book/NDK/android-ndk-r17c/sysroot/usr/include

    -isystem /home/book/NDK/android-ndk-r17c/sysroot/usr/include/arm-linux-androideabi


    isysroot 指定的头文件必须在 usr/include 中 , -isystem 不必 ;


    ④ 指定需要在 Android 手机执行配置 : -pie


    4 . 编译结果 :

    在这里插入图片描述


    该编译出的 a.out 可执行文件 , 可以在 Android 手机中 , 使用命令行执行 ;

    手机必须 root 才可以执行 , 普通手机不能执行 ;

    展开全文
  • 交叉编译工具 III . configure 脚本及帮助命令 IV . 配置 configure 脚本 V . 输出目录配置 VI . 函数库配置 VII . 程序配置选项 VIII . 组件配置选项 IX . 编码配置 X . 交叉编译配置 ( 重点 ) XI . 交叉编译配置 ...



    一、FFMPEG 源码下载 解压



    1 . FFMPEG 下载 :


    ① FFMPEG 源码下载地址 : http://ffmpeg.org/download.html#releases

    ② 本博客使用的源码下载地址 : https://ffmpeg.org/releases/ffmpeg-4.0.2.tar.bz2
    ( 也可以直接从博客资源中下载 )


    2 . 解压源码 : 使用 tar xvf ffmpeg-4.0.2.tar.bz2 命令 , 解压源码 ;

    root@octopus:~# cd FFMPEG/
    root@octopus:~/FFMPEG# ls
    ffmpeg-4.0.2.tar.bz2
    root@octopus:~/FFMPEG# tar xvf ffmpeg-4.0.2.tar.bz2 
    ffmpeg-4.0.2/
    ...
    

    解压后的内容 :

    root@octopus:~/FFMPEG/ffmpeg-4.0.2# ls
    Changelog         COPYING.LGPLv3  libavdevice    libswscale   RELEASE_NOTES
    compat            CREDITS         libavfilter    LICENSE.md   tests
    configure         doc             libavformat    MAINTAINERS  tools
    CONTRIBUTING.md   ffbuild         libavresample  Makefile     VERSION
    COPYING.GPLv2     fftools         libavutil      presets
    COPYING.GPLv3     INSTALL.md      libpostproc    README.md
    COPYING.LGPLv2.1  libavcodec      libswresample  RELEASE
    


    二、交叉编译工具



    1 . NDK 下载 : 使用 NDK 17 版本 ;


    ① NDK 地址列表 : https://developer.android.google.cn/ndk/downloads/older_releases.html

    ② 直接下载地址 : https://dl.google.com/android/repository/android-ndk-r17c-linux-x86_64.zip?hl=zh_cn


    2 . Ubuntu Linux 操作系统下载 : 使用 18.04.4 版本的系统 ;

    Ubuntu 下载地址 : http://releases.ubuntu.com



    三、configure 脚本及帮助命令



    1 . Shell 脚本 : 由第一行 Shell 解释器声明 #!/bin/sh 代码 , 可以看出 configure 是 Shell 脚本 ;

    在这里插入图片描述


    2 . configure 脚本作用 : 该脚本用于生成 make 工具的构建脚本 Makefile 文件 ;


    3 . configure 脚本执行 : 该脚本需要进行配置才能执行 , 如果直接执行 , 肯定会出错 ;
    在这里插入图片描述


    4 . configure 帮助命令 :


    ① 脚本复杂 : C/C++ 开源库都会提供一个 configure 脚本 , 该脚本的配置非常复杂 , 但一般都提供一个帮助选项 ;

    ② 帮助信息 : 执行 ./configure --help 命令 , 即可查看帮助信息 , 建议先将帮助信息熟悉一遍再进行编译 ;

    在这里插入图片描述

    博客资源中有一份完整的 configure 帮助信息内容 , 我对使用到的文档进行了注释 , 仅做参考



    四、配置 configure 脚本



    1 . FFMPEG 编译流程 :


    ① 配置 : 使用 configure 脚本进行相关参数配置 ; ( 下面会详细讲解 需要配置的 5 个类型的参数 )

    ② 编译 : 配置完毕后 , 直接执行 make 命令 , 开始进行编译 ;


    2 . 配置的内容 :


    ① 输出配置 : 配置生成的相关文件输出路径 ;

    ② 函数库配置 : 配置静态库 , 动态库 , 函数库优化等相关参数 ;

    ③ 命令行程序配置 : 配置是否生成命令行程序 , FFMPEG 自带 3 个命令行程序 ;

    ④ 编译组件配置 : FFMPEG 有 22 个可选的独立组件配置 , 可以选择性编译或不编译某些组件 ;

    ⑤ 编码解码配置 : 配置 FFMPEG 编解码相关功能 ;

    ⑥ 交叉编译配置 ( 重点 ) : 配置交叉编译工具链 , 头文件与库文件查找路径参数 , GCC 编译器参数 , CPU 指令集架构等参数 ;


    下面介绍的所有配置命令都是在 FFMPEG 源码根目录层级中执行 ;



    五、输出目录配置



    1 . 生成文件的输出目录 : FFMPEG 编译后需要生成一系列的函数库 , 及头文件等 ; 需要为这些生成的文件指定输出目录 ;


    2 . 指定生成的文件输出位置 :


    ① 定义变量 : 使用 PREFIX=./android/armeabi-v7a 命令 , 定义输出目录根目录变量 ;

    ② 路径配置 : 使用 ./configure --prefix=PREFIX 命令 , 指定输出文件的根目录为 ./android/armeabi-v7a ;

    # 将输出目录存储到 PREFIX 变量中
    PREFIX=./android/armeabi-v7a
    
    # 执行 configure 脚本配置输出文件的根目录
    ./configure --prefix=$PREFIX
    

    3 . 自动生成其它目录 : 指定了 --prefix 选项 , 那么其它生成 bin 可执行文件目录 , lib 函数库目录 等类型的文件输出目录会在 --prefix 配置的目录基础上生成 ;


    ① 根目录 : 指定了 --prefix 目录为 ./android/armeabi-v7a ;

    ② 可执行文件目录 : 自动生成的可执行文件输出目录为 PREFIX/bin , 即 ./android/armeabi-v7a/bin ;

    ③ 函数库目录 : 自动生成的函数库数据目录为 PREFIX/lib , 即 ./android/armeabi-v7a/lib ;

    其它的标准选项配置 ( Standard options ) 请仔细阅读下面的 configure 帮助文档内容 ;

    Standard options:	# 标准选项
      --logfile=FILE           log tests and output to FILE [ffbuild/config.log]
      --disable-logging        do not log configure debug information
      --fatal-warnings         fail if any configure warning is generated
      
      # 生成的文件输出目录 , 这里只需要指定一个 PREFIX 即可 
      # 指定好 PREFIX 后面的一系列目录就会自动设置好 ;
      --prefix=PREFIX          install in PREFIX [/usr/local]
    
      # 生成的可执行文件输出目录 , 指定好 PREFIX 后面的一系列目录就会自动设置好  
      --bindir=DIR             install binaries in DIR [PREFIX/bin]	
      --datadir=DIR            install data files in DIR [PREFIX/share/ffmpeg]
      --docdir=DIR             install documentation in DIR [PREFIX/share/doc/ffmpeg]
      --libdir=DIR             install libs in DIR [PREFIX/lib]
      --shlibdir=DIR           install shared libs in DIR [LIBDIR]
      --incdir=DIR             install includes in DIR [PREFIX/include]
      --mandir=DIR             install man page in DIR [PREFIX/share/man]
      --pkgconfigdir=DIR       install pkg-config files in DIR [LIBDIR/pkgconfig]
      --enable-rpath           use rpath to allow installing libraries in paths
                               not part of the dynamic linker search path
                               use rpath when linking programs (USE WITH CARE)
      --install-name-dir=DIR   Darwin directory name for installed targets
    
    Licensing options:
      --enable-gpl             allow use of GPL code, the resulting libs
                               and binaries will be under GPL [no]
      --enable-version3        upgrade (L)GPL to version 3 [no]
      --enable-nonfree         allow use of nonfree code, the resulting libs
                               and binaries will be unredistributable [no]
    


    六、函数库配置



    1 . 函数库配置 : FFMPEG 编译时 , 可以选择编译静态库或动态库 , 及设置编译函数库的行为 ;


    2 . 默认编译的函数库 : FFMPEG 默认编译静态库 , 此处也推荐在 Android 中使用 FFMPEG 静态库开发音视频功能 , 保持默认状态即可 ;


    3 . 优化函数库 :


    ① 设置后效果 : FFMPEG 编译时可以选择优化函数库大小 , 让编译出来的函数库尽可能小 , 但相应的编译速度会降低很多 ;

    ② 设置的要性 : 由于是在 Android 中进行开发 , 为了使打包后的 APK 文件尽可能小 , 这里我们需要开启该选项 ;

    ③ 设置命令 : 调用 ./configure --enable-small 命令 , 启用优化函数库大小的功能 ;

    # 启用函数库大小优化
    ./configure --enable-small
    

    其它的配置选项 ( Configuration ) 请仔细阅读下面的 configure 帮助文档内容 ;

    Configuration options:	#配置选项
    
      # 是否关闭静态库编译 , 默认值是 no 会编译静态库
      # 如果设置该选项 , 编译时不会编译静态库 ; 
      # 这里使用默认值 , 即要编译出静态库在 Android 中使用 ;		
      --disable-static         do not build static libraries [no]
      
      # 是否编译动态库 , 默认 no 即不会编译动态库 ; 这里也使用默认值
      --enable-shared          build shared libraries [no]								
    
      # 优化函数库大小 , 但是编译速度很慢 ; 
      # 如果设置该选项 , 因为 Android 中的函数库越小越好  
      --enable-small           optimize for size instead of speed	
      
      --disable-runtime-cpudetect disable detecting CPU capabilities at runtime (smaller binary)
      --enable-gray            enable full grayscale support (slower color)
      --disable-swscale-alpha  disable alpha channel support in swscale
      --disable-all            disable building components, libraries and programs
      --disable-autodetect     disable automatically detected external libraries [no]
    


    七、程序配置选项



    程序配置选项 :


    ① FFMPEG 命令行程序 : FFMPEG 提供了一些可执行的命令行程序 , 如 ffmpeg.exe , ffplay.exe , ffprobe.exe 等程序 ;

    ② 使用情况 : 在 Android 开发中只需要 FFMPEG 的函数库 , 不需要这些程序 , 建议关闭命令行程序编译选项 ;

    ③ 配置命令 : 调用 ./configure --disable-programs 命令 , 关闭编译命令行程序的功能 ;

    # 关闭编译命令行程序
    ./configure --disable-programs
    

    其它的配置选项 ( Configuration ) 请仔细阅读下面的 configure 帮助文档内容 ;

    Program options: #程序选项
    
      #关闭命令行程序编译 : FFMPEG 提供了一些可执行的命令行程序 
      #                    如 ffmpeg.exe , ffplay.exe , ffprobe.exe 等程序 ; 
      #				       但是我们只需要 FFMPEG 的函数库 , 不需要这些程序
      #					   建议关闭编译命令行程序选项 ; 
      --disable-programs       do not build command line programs
      
      # 下面是分别设置 3 个命令行程序是否进行编译
      --disable-ffmpeg         disable ffmpeg build
      --disable-ffplay         disable ffplay build
      --disable-ffprobe        disable ffprobe build
    


    八、组件配置选项



    1 . 组件配置选项 :

    默认状态 : FFMPEG 组件选项 , 默认都是打开的 , 如果需要关闭某一个需要单独配置 ;


    2 . FFMPEG 常用组件 :


    ① avdevice 组件 : 操作摄像头等视频设备 , Android 中是不支持该操作 , 需要手动关闭 ;

    ② avcodec 组件 : 声音 / 图像编解码组件 ;

    ③ avformat 组件 : 音视频封装格式生成或解析 ;

    ④ swresample 组件 : 音频重采样 , 修改音频参数 ;

    ⑤ swscale 组件 : 视频场景比例缩放 , 色彩映射转换 ;

    ⑥ postproc 组件 : 后期效果处理 , 这里不需要 , 需要手动关闭 ;

    ⑦ avfilter 组件 : 过滤器 , 添加字幕水印 ;


    3 . 关闭 avdevice 配置命令 : 调用 ./configure --disable-avdevice 命令 , 关闭 avdevice 模块编译 ;

    # 关闭编译命令行程序
    ./configure --disable-avdevice
    

    其它的组件配置选项 ( Configuration ) 请仔细阅读下面的 configure 帮助文档内容 ;

    Component options:	# FFMPEG 组件选项 , 默认都是打开的 , 如果需要关闭某一个需要单独配置
    
      # FFMPEG 由以下组件构成 , 可以定制是否编译这些组件 ;
    
      # 操作摄像头等视频设备 , Android 中是不支持该操作 , 需要手动关闭 ;
      --disable-avdevice       disable libavdevice build
      
      # 声音 / 图像编解码
      --disable-avcodec        disable libavcodec build
      
      # 音视频封装格式生成或解析
      --disable-avformat       disable libavformat build
      
      # 音频重采样 , 修改音频参数
      --disable-swresample     disable libswresample build
      
      # 视频场景比例缩放 , 色彩映射转换
      --disable-swscale        disable libswscale build
      
      # 后期效果处理 , 这里不需要 , 需要手动关闭 ;
      --disable-postproc       disable libpostproc build
      
      # 过滤器 , 添加字幕水印
      --disable-avfilter       disable libavfilter build
      
      
      --enable-avresample      enable libavresample build (deprecated) [no]
      --disable-pthreads       disable pthreads [autodetect]
      --disable-w32threads     disable Win32 threads [autodetect]
      --disable-os2threads     disable OS/2 threads [autodetect]
      --disable-network        disable network support [no]
      --disable-dct            disable DCT code
      --disable-dwt            disable DWT code
      --disable-error-resilience disable error resilience code
      --disable-lsp            disable LSP code
      --disable-lzo            disable LZO decoder code
      --disable-mdct           disable MDCT code
      --disable-rdft           disable RDFT code
      --disable-fft            disable FFT code
      --disable-faan           disable floating point AAN (I)DCT code
      --disable-pixelutils     disable pixel utils in libavutil
    


    九、编码配置



    1 . 提供的编码配置 :


    ① 编码器 : 关闭指定编码器 , 关闭所有编码器 , 打开指定编码器 ;

      # 关闭指定编码
      --disable-encoder=NAME   disable encoder NAME
      # 打开指定编码
      --enable-encoder=NAME    enable encoder NAME
      # 关闭所有编码
      --disable-encoders       disable all encoders
    

    ② 解码器 : 关闭指定解码器 , 关闭所有解码器 , 打开指定解码器 ;

      # 关闭指定解码
      --disable-decoder=NAME   disable decoder NAME
      # 打开指定解码
      --enable-decoder=NAME    enable decoder NAME
      # 关闭所有解码
      --disable-decoders       disable all decoders
    

    2 . 关闭编码配置命令 : 调用 ./configure --disable-encoders 命令 , 关闭编码器模块编译 ;

    # 关闭编译编码器
    ./configure --disable-encoders
    

    3 . 关闭混合封装配置命令 : 调用 ./configure --disable-muxers 命令 , 关闭混合封装模块编译 ;

    # 关闭混合封装
    ./configure --disable-muxers
    

    2 . 关闭视频滤镜配置命令 : 调用 ./configure --disable-filters 命令 , 关闭视频滤镜模块编译 ;

    # 关闭视频滤镜
    ./configure --disable-filters
    

    其它的单个组件配置选项 ( Configuration ) 请仔细阅读下面的 configure 帮助文档内容 ;

    Individual component options: # 单个组件配置
      --disable-everything     disable all components listed below
      
      # 关闭指定编码
      --disable-encoder=NAME   disable encoder NAME
      
      # 打开指定编码
      --enable-encoder=NAME    enable encoder NAME
      
      # 关闭所有编码
      --disable-encoders       disable all encoders
      
      # 关闭指定解码
      --disable-decoder=NAME   disable decoder NAME
      
      # 打开指定解码
      --enable-decoder=NAME    enable decoder NAME
      
      # 关闭所有解码
      --disable-decoders       disable all decoders
      
      --disable-hwaccel=NAME   disable hwaccel NAME
      --enable-hwaccel=NAME    enable hwaccel NAME
      --disable-hwaccels       disable all hwaccels
      --disable-muxer=NAME     disable muxer NAME
      --enable-muxer=NAME      enable muxer NAME
      
      # 关闭混合封装 , 混合封装就是将音频与视频封装一个视频文件
      --disable-muxers         disable all muxers
      
      --disable-demuxer=NAME   disable demuxer NAME
      --enable-demuxer=NAME    enable demuxer NAME
      --disable-demuxers       disable all demuxers
      --enable-parser=NAME     enable parser NAME
      --disable-parser=NAME    disable parser NAME
      --disable-parsers        disable all parsers
      --enable-bsf=NAME        enable bitstream filter NAME
      --disable-bsf=NAME       disable bitstream filter NAME
      --disable-bsfs           disable all bitstream filters
      --enable-protocol=NAME   enable protocol NAME
      --disable-protocol=NAME  disable protocol NAME
      --disable-protocols      disable all protocols
      --enable-indev=NAME      enable input device NAME
      --disable-indev=NAME     disable input device NAME
      --disable-indevs         disable input devices
      --enable-outdev=NAME     enable output device NAME
      --disable-outdev=NAME    disable output device NAME
      --disable-outdevs        disable output devices
      --disable-devices        disable all devices
      --enable-filter=NAME     enable filter NAME
      --disable-filter=NAME    disable filter NAME
      --disable-filters        disable all filters
    


    十、交叉编译配置 ( 重点 )



    1 . 开启交叉编译 : 调用 ./configure --enable-cross-compile 命令 , 开启交叉编译选项 ;

    # 关闭视频滤镜
    ./configure --enable-cross-compile
    

    2 . 设置交叉编译工具链前缀 :


    ① 定义 NDK 根目录变量 :

    NDK_ROOT=/root/NDK/android-ndk-r17c 
    

    ② 定义 TOOLCHAIN 交叉编译工具链目录变量 :

    TOOLCHAIN=$NDK_ROOT/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64
    

    ③ 设置交叉编译工具链前缀 :

    ./configure --cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi-
    

    实际的前缀为 : /root/NDK/android-ndk-r17c/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-


    3 . 配置头文件与库文件查找路劲 :

    ./configure --sysroot=$NDK_ROOT/platforms/android-21/arch-arm
    

    4 . 配置编译器参数 :


    ① 先定义编译器参数变量 :

    FLAGS="-isysroot $NDK_ROOT/sysroot -isystem $NDK_ROOT/sysroot/usr/include/arm-linux-androideabi -isystem $NDK_ROOT/sources/android/support/include -D__ANDROID_API__=21 -g -DANDROID -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16 -mthumb -Wa,--noexecstack -Wformat -Werror=format-security -O0 -fPIC"
    

    ② 配置编译器参数 :

    ./configure --extra-cflags=$FLAGS
    

    5 . 配置编译平台 :

    ./configure --arch=arm
    

    6 . 配置编译后的应用平台 : 编译后的函数库要在 Android 平台使用 ;

    ./configure --target-os=android 
    

    其它的编译工具链配置选项 ( Configuration ) 请仔细阅读下面的 configure 帮助文档内容 ;

    Toolchain options: # 工具链配置选项
    
      # 指定编译 CPU 指令集架构 , arm
      --arch=ARCH              select architecture []
      --cpu=CPU                select the minimum required CPU (affects
                               instruction selection, may crash on older CPUs)
    						   
      # 指定交叉编译工具链 , 即 NDK 目录下的交叉编译工具目录 , 其中有一系列的 arm-linux-androideabi-XX 工具
      # PREFIX 配置完整的路径/NDK路径/工具前缀
      # /root/NDK/android-ndk-r17c/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-
      # 后面的 gcc , g++ , ar 等工具由脚本自己补充 , 这里我们指定 gcc 前面的前缀内容
      --cross-prefix=PREFIX    use PREFIX for compilation tools []
      
      --progs-suffix=SUFFIX    program name suffix []
      
      # 开启交叉编译
      --enable-cross-compile   assume a cross-compiler is used
      
      # 头文件与库文件查找目录 , 这里要指定 NDK 中 platform 中的头文件与库文件目录 
      # 注意 : 每个 NDK 版本的头文件与库文件目录不一致 , 注意灵活配置 , 如果找不到头文件与库文件肯定报错  
      #		 注意版本兼容 , 要配置最低兼容版本的 NDK 头文件 库文件 目录
      --sysroot=PATH           root of cross-build tree
      
      
      --sysinclude=PATH        location of cross-build system headers
      
      # 指定编译的库运行的操作系统 , android
      --target-os=OS           compiler targets OS []
      
      
      --target-exec=CMD        command to run executables on target
      --target-path=DIR        path to view of build directory on target
      --target-samples=DIR     path to samples directory on target
      --tempprefix=PATH        force fixed dir/prefix instead of mktemp for checks
      --toolchain=NAME         set tool defaults according to NAME
                               (gcc-asan, clang-asan, gcc-msan, clang-msan,
                               gcc-tsan, clang-tsan, gcc-usan, clang-usan,
                               valgrind-massif, valgrind-memcheck,
                               msvc, icl, gcov, llvm-cov, hardened)
      --nm=NM                  use nm tool NM [nm -g]
      --ar=AR                  use archive tool AR [ar]
      --as=AS                  use assembler AS []
      --ln_s=LN_S              use symbolic link tool LN_S [ln -s -f]
      --strip=STRIP            use strip tool STRIP [strip]
      --windres=WINDRES        use windows resource compiler WINDRES [windres]
      --x86asmexe=EXE          use nasm-compatible assembler EXE [nasm]
      --cc=CC                  use C compiler CC [gcc]
      --cxx=CXX                use C compiler CXX [g++]
      --objcc=OCC              use ObjC compiler OCC [gcc]
      --dep-cc=DEPCC           use dependency generator DEPCC [gcc]
      --nvcc=NVCC              use Nvidia CUDA compiler NVCC [nvcc]
      --ld=LD                  use linker LD []
      --pkg-config=PKGCONFIG   use pkg-config tool PKGCONFIG [pkg-config]
      --pkg-config-flags=FLAGS pass additional flags to pkgconf []
      --ranlib=RANLIB          use ranlib RANLIB [ranlib]
      --doxygen=DOXYGEN        use DOXYGEN to generate API doc [doxygen]
      --host-cc=HOSTCC         use host C compiler HOSTCC
      --host-cflags=HCFLAGS    use HCFLAGS when compiling for host
      --host-cppflags=HCPPFLAGS use HCPPFLAGS when compiling for host
      --host-ld=HOSTLD         use host linker HOSTLD
      --host-ldflags=HLDFLAGS  use HLDFLAGS when linking for host
      --host-libs=HLIBS        use libs HLIBS when linking for host
      --host-os=OS             compiler host OS []
      
      # 传递给 gcc 编译器的参数 
      --extra-cflags=ECFLAGS   add ECFLAGS to CFLAGS []
      
      # 传递给 g++ 编译器的参数
      --extra-cxxflags=ECFLAGS add ECFLAGS to CXXFLAGS []
      
      --extra-objcflags=FLAGS  add FLAGS to OBJCFLAGS []
      --extra-ldflags=ELDFLAGS add ELDFLAGS to LDFLAGS []
      --extra-ldexeflags=ELDFLAGS add ELDFLAGS to LDEXEFLAGS []
      --extra-ldsoflags=ELDFLAGS add ELDFLAGS to LDSOFLAGS []
      --extra-libs=ELIBS       add ELIBS []
      --extra-version=STRING   version string suffix []
      --optflags=OPTFLAGS      override optimization-related compiler flags
      --nvccflags=NVCCFLAGS    override nvcc flags [-gencode arch=compute_30,code=sm_30 -O2]
      --build-suffix=SUFFIX    library name suffix []
      --enable-pic             build position-independent code
      --enable-thumb           compile for Thumb instruction set
      --enable-lto             use link-time optimization
      --env="ENV=override"     override the environment variables
    


    十一、交叉编译配置 Shell 脚本 ( 重点 )



    1 . 将本博客内容汇总后 , 编写成 Shell 脚本如下 : 在 FFMPEG 源码根目录下 , 创建 build_ffmpeg.sh 文件 , 内容如下 ;

    #!/bin/bash
    
    # NDK 根目录
    NDK_ROOT=/root/NDK/android-ndk-r17c
    
    # TOOLCHAIN 变量指向 gcc g++ 等交叉编译工具所在的目录
    TOOLCHAIN=$NDK_ROOT/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64
    
    # gcc 编译器参数
    FLAGS="-isysroot $NDK_ROOT/sysroot -isystem $NDK_ROOT/sysroot/usr/include/arm-linux-androideabi -isystem $NDK_ROOT/sources/android/support/include -D__ANDROID_API__=21 -g -DANDROID -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16 -mthumb -Wa,--noexecstack -Wformat -Werror=format-security -O0 -fPIC"
    
    # 编译结果输出路径
    PREFIX=./android/armeabi-v7a
    
    # 执行 configure 脚本生成 Makefile 构建脚本
    ./configure \
    --prefix=$PREFIX \
    --enable-small \
    --disable-programs \
    --disable-avdevice \
    --disable-encoders \
    --disable-muxers \
    --disable-filters \
    --enable-cross-compile \
    --cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
    --sysroot=$NDK_ROOT/platforms/android-21/arch-arm \
    --extra-cflags="$FLAGS" \
    --arch=arm \
    --target-os=android 
    
    # 清除之前的编译内容
    make clean
    
    # 开启新的 FFMPEG 编译
    make install
    

    2 . 修改 Shell 脚本权限 :

    chmod +x build_ffmpeg.sh
    

    3 . 执行 Shell 脚本 :

    ./build_ffmpeg.sh
    

    4 . 编译结果 :

    在这里插入图片描述

    展开全文
  • 从零搭建交叉编译
  • 交叉编译caffe时,遇见boost函数undefined reference to `boost::xxxxxx 修改makefile文件,将需要的boost::xxxxxx库,加到LIBRARIES后面 例如 .build_release/lib/libcaffe.so: undefined reference to `boost::...
  • arm交叉编译详解

    万次阅读 2016-11-03 14:38:35
    转载自 交叉编译详解–版本:v1.3.0, 有修改 CSDN GitHub arm交叉编译详解 AderXCoding/system/tools/cross_compile 本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可, 转载请注明...
  • arm交叉编译

    千次阅读 2017-12-04 18:49:14
    arm交叉编译
  • 交叉编译详解 一 概念篇

    万次阅读 多人点赞 2016-10-25 01:00:45
    本文总结了什么是交叉编译链,并介绍了交叉编译链的各个组成部分
  • OpenCV交叉编译

    千次阅读 2016-01-09 22:30:07
    交叉编译opencv2.31与移植至arm9: http://blog.csdn.net/embeddedman/article/details/7416934 2.编译OpenCV: http://blog.lehu.shu.edu.cn/byman/A264747.html 3.交叉编译OpenCV2.3.1: http://my.oschin
  • glib交叉编译

    万次阅读 2015-07-18 14:40:56
    glib是一个C语言函数库,它对很多系统调用进行了封装,提供了很多实用的功能,能极大地...为了在产品上尝试使用glib,需要对glib进行交叉编译,使其能在ARM9上运行。但编译中间会碰到很多错误,需要耐心地逐一解决。
  • Cmake 交叉编译

    千次阅读 2018-10-30 14:31:20
    交叉编译 最近由Kitware Robot编辑6个月前 页面历史记录 从版本2.6.0开始,CMake支持交叉编译交叉编译意味着该软件是为不同于构建的系统构建的。 这意味着  CMake无法自动检测目标系统  通常,可执行文件不...
  • 前言:  本文主要写给C...交叉编译工具:android-ndk64-r10-linux-x86_64.tar 交叉编译工具下载地址: 链接:https://pan.baidu.com/s/1VCttTraUoSh82ENVA4t3Og 提取码:sjwo 搭建交叉编译环境: 1、将an...
  • 嵌入式交叉编译

    千次阅读 2018-08-20 16:18:26
    1、首先将交叉编译工具链添加到环境变量中,执行sudo vi /etc/profile 注:上图中bin/下面的arm…目录下放的是交叉编译工具链,如果不写全的话不能自动补齐。 2、编辑完成后执行source /etc/profile,检查交叉编译...
  • 交叉编译工具链介绍

    2019-03-13 09:20:07
    交叉编译工具链 交叉编译就是在一种平台上编译出能运行在体系结构不同的另一种平台上的程序,比如在PC平台(X86 CPU)上编译出能运行在以ARM为内核的CPU平台上的程序,编译得到的程序在X86 CPU平台上是不能运行的,...
  • opencv交叉编译生成静态库,编译demo

    千次阅读 2018-01-28 21:22:46
    因工作需要,需在marvell平台上交叉编译出一个静态链接opencv库的可执行文件,只调用了其中的imread,resize等少数几个函数。所以我最终只交叉编译了一部分的链接库,video相关的基本都没有编译,这个后续也会描述到...
  • 什么是交叉编译

    千次阅读 多人点赞 2017-06-30 09:21:17
    第 1 章 交叉编译简介 1.1 什么是交叉编译 对于没有做过嵌入式编程的人,可能不太理解交叉编译的概念,那么什么是交叉编译?它有什么作用? 在解释什么是交叉编译之前,先要明白什么是本地编译。 本地编译 本地...
  • Cmake交叉编译

    千次阅读 2019-05-09 19:26:35
    编译 从源文件到可执行文件或库的过程,对C源文件来说,可以使用GNU编译器套装(英语:GNU Compiler Collection,缩写为GCC)来进行编译,一般语法为gcc xxx.c,C++使用g++ xxx.cpp 构建与make 代码变成可执行文件,...
  • 文章目录I . 动态库 与 静态库II .... 函数库分类 : ① 动态库 , ② 静态库 ; 2 . 静态库 : 编译链接时 , 将整个库文件打包到可执行文件中 , 造成可执行文件较大 , 但运行时不需要库文件 ; Android 与 ...
  • Ubuntu交叉编译libusb库

    千次阅读 2017-07-16 17:48:37
    Ubuntu交叉编译libusb库 参考博客: http://blog.csdn.net/tycool/article/details/18842367 软件包:libusb源码:http://www.libusb.org/ 编译环境:主机:ubuntu 16.04 ARM交叉编译工具链: arm-linux-...
  • 很多时候,对于C++软件工程师来说,可能需要编译能够在Android版本上直接运行的可执行程序、或者是编译so库文件,这个时候就需要完成交叉编译。在命令行下执行交叉编译有两种方式: 一是用NDK自带的工具链 二是使用...
  • ARM交叉编译OpenCV错误总结

    千次阅读 2017-05-03 21:29:17
    ARM交叉编译OpenCV错误总结
  • python 交叉编译到ARM

    千次阅读 2019-08-14 16:44:40
    1.交叉编译需要,先编译pc版python 再编译arm出来,用于生成语法解析器 ./configure make Parser/pgen 2. 配置 和编译 export CC=arm-openwrt-linux-gcc ./configure --host=arm-openwrt-linux --prefix=/...
  • Jrtplib rtp(3.7.1)开源库和jthread1.2.1安装(非交叉编译版以及交叉编译版) Linux (非交叉编译版) 1.要安装jrtplib前要先将开源函数库jthread1.2.1安装 Jthread(非交叉编译版)的安装: 进入jthread-...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 53,068
精华内容 21,227
关键字:

交叉编译函数