(1)创建一个 test.recipe:
# -*- Mode: Python -*- vi:si:et:sw=4:sts=4:ts=4:syntax=python
import shutil
from cerbero.utils import messages as m
class Recipe(recipe.Recipe):
name = 'test'
version = '1.0'
btype = BuildType.MAKEFILE
files_libs = ['libtest']
def prepare(self):
if self.config.target_platform == Platform.WINDOWS:
system = 'mingw'
elif self.config.target_platform in [Platform.DARWIN, Platform.IOS]:
system = 'darwin'
elif self.config.target_platform in [Platform.LINUX, Platform.ANDROID]:
system = 'posix'
# LDFLAGS are passed via XLDFLAGS, and are needed for at least Android
cc = self.get_env('CXX')
# CXX clang++用于编译cpp / CC clang+用于编译 c
ld = self.get_env('LD')
pg = self.get_env('PKG_CONFIG')
prefix = self.config.prefix
cflags = self.get_env('CXXFLAGS')
# CXXFLAGS 用于cpp / CFLAGS 用于c
ldflags = self.get_env('LDFLAGS')
self.make += ['SYS=' + system, 'prefix=' + prefix, 'XCFLAGS=' + cflags,'PKG_CONFIG=' + pg,
'XLDFLAGS=' + ldflags, 'CC=' + cc, 'LD=' + ld]
self.make_install = self.make + ['install']
# m.message("debug test ==== %s" % self.make)
async def install(self):
library_path = os.path.join(self.config.prefix, 'lib')
out_lib = os.path.join(self.make_dir, 'libtest.so')
shutil.copy(out_lib, library_path)
(2) 创建插件源码目录test-1.0 : Makefile test.c
BIN=libtest.so
CC?=$(CROSS_COMPILE)gcc
LD?=$(CROSS_COMPILE)ld
AR?=$(CROSS_COMPILE)ar
#CFLAGS = -shared -fPIC
LIBS=
CFLAGS=-Wall $(XCFLAGS) -fPIC
LDFLAGS=$(XLDFLAGS) -shared -Wl,-soname,$@
INCS=-I./include/ #头文件目录
SRCS:=$(wildcard *.cpp) #.c文件目录
COBJS:=$(SRCS:.cpp=.o)
all:$(BIN)
PKG?=$(PKG_CONFIG)
LIB_GST = `$(PKG) --cflags --libs gstreamer-1.0`
CFLAGS += $(LIB_GST)
#引用了gst.h头文件
$(COBJS) : %.o: %.cpp
$(CC) -c $< -o $@ $(INCS) $(CFLAGS)
$(BIN):$(COBJS)
$(CC) -o $(BIN) $(COBJS) ${LDFLAGS} $(LIBS) $(CFLAGS)
clean:
rm $(BIN) $(COBJS)
distclean:clean
install:$(BIN)
@echo "begin install "$(BIN)
.PYHONY:install
test.cpp
#include <stdio.h>
#include <gst/gst.h>
#include <libavcodec/avcodec.h>
extern "C" int test()
{
return 10;
}
(4)编译插件
(因为依赖了gst.h/avcodec.h,所以需要先整体编译一遍才会在dist下生成相关头文件/依赖库/*.pc)
单独编译插件:
./cerbero-uninstalled -c config/cross-android-x86-64.cbc build test
说明:
可以看完整编译命令,编译工具CC/CXX/PKG_CONFIG等,cebero已经默认添加到了env中,包括pkg-config寻找pc的路径也设置到了env(通过打印self.env),同时相关头文件等依赖也添加到了make中, -isystem -isysroot等。