本文非官方教程,纯属业余折腾
官方教程链接:https://device.harmonyos.com/cn/docs/develop/transplant/transplant-thirdparty-makefile-0000001064218672
一、文件准备
1. ffmpeg源码下载(本文用的n4.4)
https://github.com/FFmpeg/FFmpeg/tags
2. 官方sysroot和llvm下载
- sysroot目录: 克隆仓库并切到OpenHarmony-v2.2-Beta分支
git clone git@gitee.com:openharmony/prebuilts_lite_sysroot.git --branch OpenHarmony-v2.2-Beta
- 编译器: llvm
wget https://repo.huaweicloud.com/harmonyos/compiler/clang/10.0.1-62608/linux/llvm.tar.gz -O ./llvm.tar.gz
3. 编译工具说明
- 关于sysroot目录,用到2个文件夹,内含平台相关的基础库,参与编译时使用-I和-L配置到cflags
sysroot/usr/include/arm-liteos
sysroot/usr/lib/arm-liteos
- llvm常用到的几个工具
llvm/bin/clang // 相当于我们熟悉的gcc
llvm/bin/clang++
llvm/bin/llvm-ar
llvm/bin/llvm-as
llvm/bin/llvm-nm
llvm/bin/llvm-strip
llvm/bin/llvm-ranlib
llvm/bin/llvm-objdump
llvm/bin/ld.lld
- llvm作为编译器自带两个库目录,内涵基础c/c++库,同样使用-I和-L配置到cflags
llvm/include
llvm/lib
- 最后是官方提到的配置项,也添加到cflags,这里的OHOS_ROOT_PATH当然就是上面clone下载的sysroot目录啦
–target=arm-liteos -march=armv7-a --sysroot=$(OHOS_ROOT_PATH)
二、编译
1. 文件准备如图
2. 编写 Makefile
ROOT = $(shell pwd)
INSTALL = $(ROOT)/install
# sdk
SYSROOT = $(ROOT)/sysroot
LLVM = $(ROOT)/llvm
# compile
CLANG = $(LLVM)/bin/clang
CLANGXX = $(LLVM)/bin/clang++
AR = $(LLVM)/bin/llvm-ar
AS = $(LLVM)/bin/llvm-as
NM = $(LLVM)/bin/llvm-nm
RANLIB = $(LLVM)/bin/llvm-ranlib
STRIP = $(LLVM)/bin/llvm-strip
OBJDUMP = $(LLVM)/bin/llvm-objdump
LD = $(LLVM)/bin/ld.lld
# cflags
OHOS_CFLAGS = --target=arm-liteos -march=armv7-a --sysroot=$(SYSROOT)
OHOS_CFLAGS += -I$(SYSROOT)/usr/include/arm-liteos
OHOS_CFLAGS += -L$(SYSROOT)/usr/lib/arm-liteos
OHOS_CFLAGS += -I$(LLVM)/include
OHOS_CFLAGS += -L$(LLVM)/lib
ffmpeg:
@mkdir -p $(INSTALL) && \
tar -xzf $(ROOT)/FFmpeg-n4.4.tar.gz -C $(INSTALL) && \
cd $(INSTALL)/FFmpeg-n4.4 && \
./configure \
--prefix=$(INSTALL) \
--arch=armv7-a \
--target-os=linux \
--disable-asm \
--disable-programs \
--disable-avdevice \
--enable-cross-compile \
--enable-small \
--enable-shared \
--cc=$(CLANG) \
--ld=$(CLANG) \
--strip=$(STRIP) \
--extra-cflags="$(OHOS_CFLAGS) $(OHOS_INCS) $(OHOS_LIBS)" \
--extra-ldflags="$(OHOS_CFLAGS) $(OHOS_INCS) $(OHOS_LIBS)" && \
make -j4 && make install && \
cd - && \
rm -rf $(INSTALL)/FFmpeg-n4.4
3. 编译
make ffmpeg
- 编译结束生成依赖库和头文件到install目录
三、总结
1. 基本套路
-
利用configure的CC、cc、–cc、CFLAGS、–extra-cflags等替换编译工具以及添加cflags,有些库–help时可能见不到这些参数,但不妨试试,有些只是没有显示而已;
-
遇到没法通过configure配置的,可以先配置成arm交叉编译器,再通过sed替换Makefile、.mk、.mak文件中的编译器和cflags;
2. 检查生成文件
- 使用file指令检查.o、.so文件的编译器信息,时常检查,避免多重依赖时链接检查不通过;以上面编译生成的文件为例,正确结果如图,否则可能使用了系统gcc;
3. 其它问题
- OpenHarmony系统中已存在部分ffmpeg库文件,混用可能存在链接错乱问题,不知道通过修改ffmpeg库名称或使用-Wl,-soname可否避免。
四、参考工程
- https://gitee.com/wexiangis/ffmpeg5-build