Использование библиотеки FFMPEG в PPAPI: Naclports с FFmpeg

Я настроил веб-порты, ffmpeg; и я создал следующий Makefile для текущего проекта. Однако я столкнулся с проблемой привязки библиотеки ffmpeg.

$ TOOLCHAIN=pnacl make
  LINK pnacl/Release/client_unstripped.bc
pnacl/Release/src/client.o: error: undefined reference to 'av_register_all'
make: *** [pnacl/Release/client_unstripped.bc] Error 1

Можете ли вы сказать мне, что я делаю неправильно, мой Makefile показан ниже:

VALID_TOOLCHAINS := pnacl glibc clang-newlib win

NACL_SDK_ROOT ?= $(abspath $(CURDIR)/../..)

ЦЕЛЬ = клиент

ДРУГОЙКАТАЛОГ=источник

INC_DIR = вкл.

FFMPEG_INC_DIR = ../../toolchain/mac_pnacl/le32-nacl/usr/include

ВКЛЮЧАЕТ = -I$(INC_DIR) -I$(FFMPEG_INC_DIR)

включить $(NACL_SDK_ROOT)/tools/common.mk

CHROME_ARGS += --allow-nacl-socket-api=localhost

LIBS = nacl_io ppapi_cpp ppapi

CFLAGS = -Wall -g -O2 $(ВКЛЮЧАЕТ) -L../../toolchain/mac_pnacl/le32-nacl/usr/lib -lavformat \ -lvpx -lvorbisenc -lvorbis -logg -ltheoraenc -ltheoradec -logg -lmp3lame -lm -pthread -lavcodec -lvpx -lvorbisenc -lvorbis -logg \ -ltheoraenc -ltheoradec -logg -lmp3lame -lm -pthread -lswresample -lm -lavutil -lm -lavdevice -lavfilter

SOURCES = $(OTHERDIR)/tcp_util.cc $(OTHERDIR)/tpool.cc $(OTHERDIR)/net.cc $(OTHERDIR)/rtsp_response.cc \ $(OTHERDIR)/rtsp.cc $(OTHERDIR)/rtsp_common. cc \ $(OTHERDIR)/rtsp_client.cc $(OTHERDIR)/udp_util.cc \ $(OTHERDIR)/client.cc

# Строим правила, сгенерированные макросами из common.mk:

$(foreach src,$(SOURCES),$(eval $(вызов COMPILE_RULE,$(src),$(CFLAGS))))

# Рабочий процесс PNaCl использует как неразрезанный, так и завершенный/разрезанный двоичный файл. # На NaCl создавайте очищенный двоичный файл только для конфигураций выпуска (не для отладки). ifneq (,$(или $(findstring pnacl,$(TOOLCHAIN)),$(findstring Release,$(CONFIG)))) $(eval $(вызов LINK_RULE,$(TARGET)_unstripped,$(SOURCES),$( LIBS),$(DEPS))) $(eval $(вызов STRIP_RULE,$(TARGET),$(TARGET)_unstripped)) else $(eval $(вызов LINK_RULE,$(TARGET),$(ИСТОЧНИКИ),$( LIBS),$(DEPS))) endif

$(eval $(вызов NMF_RULE,$(ЦЕЛЬ),))

А вот как библиотека использовалась в контексте класса.

class VideoDecodePack {
public:
    VideoDecodePack() {
        av_register_all();
    }
};

class ClientInstance : public pp::Instance {
 public:
  explicit ClientInstance(PP_Instance instance) : pp::Instance(instance){
    cses = InitRtspClientSession();
    _videoDecoder = new VideoDecodePack();
  }
...

person rasulzhan    schedule 07.04.2016    source источник


Ответы (1)


Я решил эту проблему, добавив линковку с дополнительными библиотеками для FFMPEG: vpx, vorbis, lame. И очень важно соблюдать порядок связанных библиотек.

.....
...
TARGET = client
INC_DIR := inc

include $(NACL_SDK_ROOT)/tools/common.mk

DEPS = ppapi_simple nacl_io
LIBS = ppapi_simple nacl_io ppapi pthread \
avformat vpx vorbisenc vorbis ogg theoraenc \
theoradec mp3lame m avcodec swresample avutil \
avdevice avfilter

OTHERDIR = src

CFLAGS = -Wall
# -I$(INC_DIR)
SOURCES = $(OTHERDIR)/client.cc

# Build rules generated by macros from common.mk:

$(foreach dep,$(DEPS),$(eval $(call DEPEND_RULE,$(dep))))
$(foreach src,$(SOURCES),$(eval $(call COMPILE_RULE,$(src),$(CFLAGS))))
....
...   
person rasulzhan    schedule 14.04.2016