Mac平台下为Android平台编译libx265库

本文主要介绍如何在Mac OSX平台上使用cmake对libx265进行交叉编译,生成能在Android平台下使用的动态库so文件

准备工作

  1. 下载libx265源码并解压,我使用的版本是2.4 下载传送门
  2. 下载Android NDK编译链,我使用的NDK版本号是android-ndk-r10e
  3. 确保本机已经安装cmake

编译流程

  1. 进入libx265下的build/arm-linux/目录
  2. 使用文本编辑crosscompile.cmake文件,按照如下进行设置

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    set(CMAKE_SYSTEM_NAME Android)
    #此处设置Android的API版本
    set(CMAKE_ANDROID_API 9)
    #此处设置Android的ABI,如armeabi、armeabi-v7a、x86等
    set(CMAKE_ANDROID_ARCH_ABI armeabi-v7a)
    #此处设置Android的NDK路径
    set(CMAKE_ANDROID_NDK "/android/android-ndk-r10e")
    #此处设置Android的系统目录,与ABI相关,如$NDK/platforms/android-9/arch-arm、/platforms/android-9/arch-x86
    set(CMAKE_SYSROOT "/android/android-ndk-r10e/platforms/android-9/arch-arm")
    set(CMAKE_ANDROID_STL_TYPE "c++_static")
    set(CMAKE_CXX_FLAGS "-std=c++11 ${CMAKE_CXX_FLAGS}")
    set(CMAKE_CXX_STANDARD 11)
    include_directories(../../source)
  3. 控制台进入到libx265/build/arm-linux/下,执行

    1
    cmake -DCMAKE_TOOLCHAIN_FILE=crosscompile.cmake -G "Unix Makefiles" ../../source && ccmake ../../source
  4. 上面命令执行之后会对libx265进行基本的配置,如下图

  5. 配置完成之后会弹出cmake gui界面,可以对libx265进行配置,此处我们不进行修改,直接按c键进行配置,然后再按g键进行生成配置文件,生成之后cmake会自动退出,如下图
  6. 控制台执行make命令,开始交叉编译,如图
  7. 编译成功后可以在libx265/build/arm-linux/目录下找到libx265.a和libx265.so文件,至此大功告成

编译过程中可能出现的问题

posix_memalign函数找不到

1
'posix_memalign' was not declared in this scope

解决方法:

文本编辑器打开source/common/common.cpp文件,找到如下代码段

1
2
3
4
5
6
7
8
9
void *x265_malloc(size_t size)
{
void *ptr;
if (posix_memalign((void**)&ptr, X265_ALIGNBYTES, size) == 0)
return ptr;
else
return NULL;
}

修改为

1
2
3
4
5
6
7
8
9
void *x265_malloc(size_t size)
{
void *ptr = memalign(X265_ALIGNBYTES, size);
if (ptr != NULL)
return ptr;
else
return NULL;
}

再次执行make即可

=======================

-lpthread找不到

1
error: cannot find -lpthread

解决方法:

文本编辑器打开source/CMakeLists.txt文件,全局搜索关键字-lpthread,找到如下代码段

1
2
找到 list(APPEND PLATFORM_LIBS pthread) 改为 list(APPEND PLATFORM_LIBS)
找到 list(REMOVE_ITEM PLIBLIST "-lc" "-lpthread") 改为 list(REMOVE_ITEM PLIBLIST "-lc")

再次执行make即可