通过Makefile构build和构build脚本工作,但与等效的Makefile.am没有(给出未定义的引用错误)

我试图将ccextractor(开源的隐藏式字幕提取器)的构build机制从自定义的Makefile转换为Autotools生成的Makefile。

提供的Makefile如下所示:

SHELL = /bin/sh CC = gcc SYS := $(shell gcc -dumpmachine) CFLAGS = -O3 -std=gnu99 -s INCLUDE = -Isrc/gpacmp4/ -Isrc/libpng -Isrc/lib_hash -Isrc/protobuf-c -Isrc/zlib -Isrc/lib_ccx -Isrc/. INCLUDE += -Isrc/zvbi -Isrc/utf8proc ALL_FLAGS = -Wno-write-strings -D_FILE_OFFSET_BITS=64 -DVERSION_FILE_PRESENT LDFLAGS = -lm ifneq (, $(findstring linux, $(SYS))) CFLAGS +=-DGPAC_CONFIG_LINUX endif TARGET = ccextractor OBJS_DIR = objs VPATH = src:src/gpacmp4:src/libpng:src/zlib:src/lib_ccx:src/zvbi:src/lib_hash:src/utf8proc:src/protobuf-c SRCS_DIR = src SRCS_C = $(wildcard $(SRCS_DIR)/*.c) OBJS = $(SRCS_C:$(SRCS_DIR)/%.c=$(OBJS_DIR)/%.o) SRCS_CCX_DIR = $(SRCS_DIR)/lib_ccx SRCS_CCX = $(wildcard $(SRCS_CCX_DIR)/*.c) OBJS_CCX = $(SRCS_CCX:$(SRCS_CCX_DIR)/%.c=$(OBJS_DIR)/%.o) SRCS_PNG_DIR = $(SRCS_DIR)/libpng SRCS_PNG = $(wildcard $(SRCS_PNG_DIR)/*.c) OBJS_PNG = $(SRCS_PNG:$(SRCS_PNG_DIR)/%.c=$(OBJS_DIR)/%.o) SRCS_ZVBI_DIR = $(SRCS_DIR)/zvbi SRCS_ZVBI = $(wildcard $(SRCS_ZVBI_DIR)/*.c) OBJS_ZVBI = $(SRCS_ZVBI:$(SRCS_ZVBI_DIR)/%.c=$(OBJS_DIR)/%.o) SRCS_GPACMP4_DIR = $(SRCS_DIR)/gpacmp4 SRCS_GPACMP4_C = $(wildcard $(SRCS_GPACMP4_DIR)/*.c) SRCS_GPACMP4_CPP = $(wildcard $(SRCS_GPACMP4_DIR)/*.cpp) OBJS_GPACMP4 = $(SRCS_GPACMP4_C:$(SRCS_GPACMP4_DIR)/%.c=$(OBJS_DIR)/%.o) \ $(SRCS_GPACMP4_CPP:$(SRCS_GPACMP4_DIR)/%.cpp=$(OBJS_DIR)/%.o) SRCS_ZLIB_DIR = $(SRCS_DIR)/zlib SRCS_ZLIB = $(wildcard $(SRCS_ZLIB_DIR)/*.c) OBJS_ZLIB = $(SRCS_ZLIB:$(SRCS_ZLIB_DIR)/%.c=$(OBJS_DIR)/%.o) SRCS_HASH_DIR = $(SRCS_DIR)/lib_hash SRCS_HASH = $(wildcard $(SRCS_HASH_DIR)/*.c) OBJS_HASH = $(SRCS_HASH:$(SRCS_HASH_DIR)/%.c=$(OBJS_DIR)/%.o) SRCS_UTF8_DIR = $(SRCS_DIR)/utf8proc SRCS_UTF8 = $(SRCS_UTF8_DIR)/utf8proc.c OBJS_UTF8 = $(SRCS_UTF8:$(SRCS_UTF8_DIR)/%.c=$(OBJS_DIR)/%.o) INSTLALL = cp -f -p INSTLALL_PROGRAM = $(INSTLALL) DESTDIR = /usr/bin ifeq ($(ENABLE_HARDSUBX),yes) ENABLE_OCR=yes CFLAGS+=-DENABLE_HARDSUBX CFLAGS+= $(shell pkg-config --cflags libavcodec) CFLAGS+= $(shell pkg-config --cflags libavformat) CFLAGS+= $(shell pkg-config --cflags libavutil) CFLAGS+= $(shell pkg-config --cflags libswscale) AV_LDFLAGS+= $(shell pkg-config --libs libavcodec ) AV_LDFLAGS+= $(shell pkg-config --libs libavformat ) AV_LDFLAGS+= $(shell pkg-config --libs libavutil ) AV_LDFLAGS+= $(shell pkg-config --libs libswscale ) ifeq ($(AV_LDFLAGS),$(EMPTY)) $(error **ERROR** "libav not found") else $(info "libav found") endif LDFLAGS+= $(AV_LDFLAGS) endif ifeq ($(ENABLE_OCR),yes) CFLAGS+=-DENABLE_OCR -DPNG_NO_CONFIG_H LEPT_LDFLAGS+= $(shell pkg-config --libs lept) ifneq ($(shell pkg-config --exists tesseract), $(EMPTY)) TESS_LDFLAGS+= $(shell pkg-config --libs tesseract) TESS_CFLAGS+= $(shell pkg-config --cflags tesseract) else #fix for raspberry pi not having a pkgconfig file for tesseract ifneq ($(wildcard /usr/include/tesseract/*),$(EMPTY)) TESS_LDFLAGS+= -ltesseract TESS_CFLAGS+= -I/usr/include/tesseract endif endif #error checking of library are there or not ifeq ($(TESS_LDFLAGS),$(EMPTY)) $(error **ERROR** "tesseract not found") else #TODO print the version of library found $(info "tesseract found") endif ifeq ($(LEPT_LDFLAGS),$(EMPTY)) $(error **ERROR** "leptonica not found") else #TODO print the version of library found $(info "Leptonica found") endif CFLAGS += $(TESS_CFLAGS) CFLAGS += $(shell pkg-config --cflags lept) LDFLAGS += $(TESS_LDFLAGS) LDFLAGS += $(LEPT_LDFLAGS) endif ifeq ($(ENABLE_FFMPEG),yes) CFLAGS+=-DENABLE_FFMPEG CFLAGS+= $(shell pkg-config --cflags libavcodec) CFLAGS+= $(shell pkg-config --cflags libavformat) CFLAGS+= $(shell pkg-config --cflags libavutil) LDFLAGS+= $(shell pkg-config --libs libavcodec ) LDFLAGS+= $(shell pkg-config --libs libavformat ) LDFLAGS+= $(shell pkg-config --libs libavutil ) endif .PHONY: all all: pre-build objs_dir $(TARGET) .PHONY: objs_dir objs_dir: mkdir -p $(OBJS_DIR) $(TARGET): $(OBJS) $(OBJS_PNG) $(OBJS_GPACMP4) $(OBJS_ZVBI) $(OBJS_ZLIB) $(OBJS_HASH) $(OBJS_CCX) $(OBJS_UTF8) $(CC) $(ALL_FLAGS) $(CFLAGS) $(OBJS) $(OBJS_CCX) $(OBJS_PNG) $(OBJS_ZVBI) $(OBJS_GPACMP4) $(OBJS_ZLIB) $(OBJS_HASH) $(OBJS_UTF8) $(LDFLAGS) -o $@ $(OBJS_DIR)/%.o: %.c $(CC) -c $(ALL_FLAGS) $(INCLUDE) $(CFLAGS) $< -o $@ $(OBJS_DIR)/%.o: %.cpp $(CC) -c $(ALL_FLAGS) $(INCLUDE) $(CFLAGS) $< -o $@ -Isrc/gpacmp4 $(OBJS_DIR)/ccextractor.o: ccextractor.c $(CC) -c $(ALL_FLAGS) $(INCLUDE) $(CFLAGS) -O0 $< -o $@ .PHONY: clean clean: rm -rf $(TARGET) 2>/dev/null || true rm -rf $(OBJS_CCX) $(OBJS_PNG) $(OBJS_ZLIB) $(OBJS_GPACMP4) $(OBJS_HASH) $(OBJS_UTF8) $(OBJS) 2>/dev/null || true rm -rdf $(OBJS_DIR) 2>/dev/null || true rm -rf .depend 2>/dev/null || true .PHONY: install install: $(TARGET) $(INSTLALL_PROGRAM) $(TARGET) $(DESTDIR) .PHONY: uninstall uninstall: rm -iv $(DESTDIR)/$(TARGET) .PHONY: depend dep depend dep: $(CC) $(CFLAGS) $(INCLUDE) -E -MM $(SRCS_C) $(SRCS_PNG) $(SRCS_ZVBI) $(SRCS_ZLIB) $(SRCS_HASH) $(SRCS_UTF8) $(SRCS_CCX) \ $(SRCS_GPACMP4_C) $(SRCS_GPACMP4_CPP) |\ sed 's/^[a-zA-Z_0-9]*.o/$(OBJS_DIR)\/&/' > .depend .PHONY: pre-build pre-build: ./pre-build.sh -include .depend 

“ccextractor”也是通过一个名为buildshell脚本build

构build“ccextractor”的build脚本非常好:

 #!/bin/bash BLD_FLAGS="-std=gnu99 -Wno-write-strings -DGPAC_CONFIG_LINUX -D_FILE_OFFSET_BITS=64 -DVERSION_FILE_PRESENT -DENABLE_OCR" BLD_INCLUDE="-Isrc -I /usr/include/leptonica/ -I /usr/include/tesseract/ -Isrc/lib_ccx/ -Isrc/gpacmp4/ -Isrc/libpng/ -Isrc/zlib/ -Isrc/zvbi -Isrc/lib_hash -Isrc/protobuf-c -Isrc/utf8proc" SRC_LIBPNG="$(find src/libpng/ -name '*.c')" SRC_ZLIB="$(find src/zlib/ -name '*.c')" SRC_ZVBI="$(find src/zvbi/ -name '*.c')" SRC_CCX="$(find src/lib_ccx/ -name '*.c')" SRC_GPAC="$(find src/gpacmp4/ -name '*.c')" SRC_HASH="$(find src/lib_hash/ -name '*.c')" SRC_PROTOBUF="$(find src/protobuf-c/ -name '*.c')" SRC_UTF8PROC="src/utf8proc/utf8proc.c" BLD_SOURCES="src/ccextractor.c $SRC_CCX $SRC_GPAC $SRC_ZLIB $SRC_ZVBI $SRC_LIBPNG $SRC_HASH $SRC_PROTOBUF $SRC_UTF8PROC" BLD_LINKER="-lm -zmuldefs -l tesseract -l lept" .**Stripped a call for shell script that checks git commit (Nothing that would interfere with the build** out=$((LC_ALL=C gcc $BLD_FLAGS $BLD_INCLUDE -o ccextractor $BLD_SOURCES $BLD_LINKER) 2>&1) res=$? if [[ $out == *"gcc: command not found"* ]] then echo "Error: please install gcc"; exit 1 fi if [[ $out == *"curl.h: No such file or directory"* ]] then echo "Error: please install curl development library (libcurl4-gnutls-dev for Debian/Ubuntu)"; exit 2 fi if [[ $out == *"capi.h: No such file or directory"* ]] then echo "Error: please install tesseract development library (tesseract-ocr-dev for Debian/Ubuntu)"; exit 3 fi if [[ $out == *"allheaders.h: No such file or directory"* ]] then echo "Error: please install leptonica development library (libleptonica-dev for Debian/Ubuntu)"; exit 4 fi if [[ $res -ne 0 ]] # Unknown error then echo "Compiled with errors" >&2 echo "$out" exit 5 fi echo "Compilation successful"; 

通过上面的build Makefilebuild脚本工作正常。 我的Makefile.am如下所示:

  AUTOMAKE_OPTIONS = foreign bin_PROGRAMS = ccextractor ccextractor_SOURCES = \ src/ccextractor.c \ src/gpacmp4/avc_ext.c \ src/gpacmp4/avilib.c \ src/gpacmp4/av_parsers.c \ src/gpacmp4/base_encoding.c \ src/gpacmp4/bitstream.c \ src/gpacmp4/box_code_3gpp.c \ src/gpacmp4/box_code_adobe.c \ src/gpacmp4/box_code_apple.c \ src/gpacmp4/box_code_base.c \ src/gpacmp4/box_code_drm.c \ src/gpacmp4/box_code_meta.c \ src/gpacmp4/box_funcs.c \ src/gpacmp4/configfile.c \ src/gpacmp4/data_map.c \ src/gpacmp4/desc_private.c \ src/gpacmp4/descriptors.c \ src/gpacmp4/drm_sample.c \ src/gpacmp4/error.c \ src/gpacmp4/gpac/avparse.h \ src/gpacmp4/gpac/base_coding.h \ src/gpacmp4/gpac/bitstream.h \ src/gpacmp4/gpac/config_file.h \ src/gpacmp4/gpac/configuration.h \ src/gpacmp4/gpac/constants.h \ src/gpacmp4/gpac/events_constants.h \ src/gpacmp4/gpac/ietf.h \ src/gpacmp4/gpac/internal src/gpacmp4/gpac/internal/avilib.h \ src/gpacmp4/gpac/internal/isomedia_dev.h \ src/gpacmp4/gpac/internal/media_dev.h \ src/gpacmp4/gpac/internal/odf_dev.h \ src/gpacmp4/gpac/internal/odf_parse_common.h \ src/gpacmp4/gpac/internal/ogg.h \ src/gpacmp4/gpac/isomedia.h \ src/gpacmp4/gpac/list.h \ src/gpacmp4/gpac/math.h \ src/gpacmp4/gpac/media_tools.h \ src/gpacmp4/gpac/mpeg4_odf.h \ src/gpacmp4/gpac/network.h \ src/gpacmp4/gpac/revision.h \ src/gpacmp4/gpac/setup.h \ src/gpacmp4/gpac/sync_layer.h \ src/gpacmp4/gpac/tools.h \ src/gpacmp4/gpac/utf.h \ src/gpacmp4/gpac/version.h \ src/gpacmp4/gpac_ogg.c \ src/gpacmp4/hinting.c \ src/gpacmp4/ipmpx_code.c \ src/gpacmp4/ipmpx_parse.c \ src/gpacmp4/isom_intern.c \ src/gpacmp4/isom_read.c \ src/gpacmp4/isom_store.c \ src/gpacmp4/isom_write.c \ src/gpacmp4/list.c \ src/gpacmp4/math.c \ src/gpacmp4/media.c \ src/gpacmp4/media_odf.c \ src/gpacmp4/meta.c \ src/gpacmp4/movie_fragments.c \ src/gpacmp4/mp4.c \ src/gpacmp4/odf_code.c \ src/gpacmp4/odf_codec.c \ src/gpacmp4/odf_command.c \ src/gpacmp4/os_config_init.c \ src/gpacmp4/os_divers.c \ src/gpacmp4/os_file.c \ src/gpacmp4/qos.c \ src/gpacmp4/ReadMe.txt src/gpacmp4/sample_descs.c \ src/gpacmp4/slc.c \ src/gpacmp4/stbl_read.c \ src/gpacmp4/stbl_write.c \ src/gpacmp4/track.c \ src/gpacmp4/tx3g.c \ src/gpacmp4/url.c \ src/gpacmp4/utf.c \ src/lib_ccx/activity.c \ src/lib_ccx/activity.h \ src/lib_ccx/asf_constants.h \ src/lib_ccx/asf_functions.c \ src/lib_ccx/avc_functions.c \ src/lib_ccx/avc_functions.h \ src/lib_ccx/bitstream.h \ src/lib_ccx/cc_bitstream.c \ src/lib_ccx/ccx_common_char_encoding.c \ src/lib_ccx/ccx_common_char_encoding.h \ src/lib_ccx/ccx_common_common.c \ src/lib_ccx/ccx_common_common.h \ src/lib_ccx/ccx_common_constants.c \ src/lib_ccx/ccx_common_constants.h \ src/lib_ccx/ccx_common_option.c \ src/lib_ccx/ccx_common_option.h \ src/lib_ccx/ccx_common_platform.h \ src/lib_ccx/ccx_common_structs.h \ src/lib_ccx/ccx_common_timing.c \ src/lib_ccx/ccx_common_timing.h \ src/lib_ccx/ccx_decoders_608.c \ src/lib_ccx/ccx_decoders_608.h \ src/lib_ccx/ccx_decoders_708.c \ src/lib_ccx/ccx_decoders_708_encoding.c \ src/lib_ccx/ccx_decoders_708_encoding.h \ src/lib_ccx/ccx_decoders_708.h \ src/lib_ccx/ccx_decoders_708_output.c \ src/lib_ccx/ccx_decoders_708_output.h \ src/lib_ccx/ccx_decoders_common.c \ src/lib_ccx/ccx_decoders_common.h \ src/lib_ccx/ccx_decoders_isdb.c \ src/lib_ccx/ccx_decoders_isdb.h \ src/lib_ccx/ccx_decoders_structs.h \ src/lib_ccx/ccx_decoders_vbi.c \ src/lib_ccx/ccx_decoders_vbi.h \ src/lib_ccx/ccx_decoders_xds.c \ src/lib_ccx/ccx_decoders_xds.h \ src/lib_ccx/ccx_demuxer.c \ src/lib_ccx/ccx_demuxer.h \ src/lib_ccx/ccx_dtvcc.c \ src/lib_ccx/ccx_dtvcc.h \ src/lib_ccx/ccx_encoders_common.c \ src/lib_ccx/ccx_encoders_common.h \ src/lib_ccx/ccx_encoders_curl.c \ src/lib_ccx/ccx_encoders_g608.c \ src/lib_ccx/ccx_encoders_helpers.c \ src/lib_ccx/ccx_encoders_helpers.h \ src/lib_ccx/ccx_encoders_sami.c \ src/lib_ccx/ccx_encoders_smptett.c \ src/lib_ccx/ccx_encoders_splitbysentence.c \ src/lib_ccx/ccx_encoders_spupng.c \ src/lib_ccx/ccx_encoders_spupng.h \ src/lib_ccx/ccx_encoders_srt.c \ src/lib_ccx/ccx_encoders_ssa.c \ src/lib_ccx/ccx_encoders_structs.h \ src/lib_ccx/ccx_encoders_transcript.c \ src/lib_ccx/ccx_encoders_webvtt.c \ src/lib_ccx/ccx_encoders_xds.c \ src/lib_ccx/ccx_encoders_xds.h \ src/lib_ccx/ccx_gxf.c \ src/lib_ccx/ccx_gxf.h \ src/lib_ccx/ccx_mp4.h \ src/lib_ccx/ccx_share.c \ src/lib_ccx/ccx_share.h \ src/lib_ccx/ccx_sub_entry_message.pb-cc \ src/lib_ccx/ccx_sub_entry_message.pb-ch \ src/lib_ccx/CMakeLists.txt src/lib_ccx/compile_info.h \ src/lib_ccx/compile_info_real.h \ src/lib_ccx/configuration.c \ src/lib_ccx/configuration.h \ src/lib_ccx/disable_warnings.h \ src/lib_ccx/dvb_subtitle_decoder.c \ src/lib_ccx/dvb_subtitle_decoder.h \ src/lib_ccx/dvd_subtitle_decoder.c \ src/lib_ccx/dvd_subtitle_decoder.h \ src/lib_ccx/es_functions.c \ src/lib_ccx/es_userdata.c \ src/lib_ccx/ffmpeg_intgr.c \ src/lib_ccx/ffmpeg_intgr.h \ src/lib_ccx/file_buffer.h \ src/lib_ccx/file_functions.c \ src/lib_ccx/general_loop.c \ src/lib_ccx/hamming.h \ src/lib_ccx/hardsubx.c \ src/lib_ccx/hardsubx_classifier.c \ src/lib_ccx/hardsubx_decoder.c \ src/lib_ccx/hardsubx.h \ src/lib_ccx/hardsubx_imgops.c \ src/lib_ccx/hardsubx_utility.c \ src/lib_ccx/lib_ccx.c \ src/lib_ccx/lib_ccx.h \ src/lib_ccx/list.h \ src/lib_ccx/matroska.c \ src/lib_ccx/matroska.h \ src/lib_ccx/myth.c \ src/lib_ccx/networking.c \ src/lib_ccx/networking.h \ src/lib_ccx/ocr.c \ src/lib_ccx/ocr.h \ src/lib_ccx/output.c \ src/lib_ccx/params.c \ src/lib_ccx/params_dump.c \ src/lib_ccx/sequencing.c \ src/lib_ccx/spupng_encoder.c \ src/lib_ccx/spupng_encoder.h \ src/lib_ccx/stdintmsc.h \ src/lib_ccx/stream_functions.c \ src/lib_ccx/teletext.h \ src/lib_ccx/telxcc.c \ src/lib_ccx/ts_functions.c \ src/lib_ccx/ts_functions.h \ src/lib_ccx/ts_info.c \ src/lib_ccx/ts_tables.c \ src/lib_ccx/ts_tables_epg.c \ src/lib_ccx/utility.c \ src/lib_ccx/utility.h \ src/lib_ccx/wtv_constants.h \ src/lib_ccx/wtv_functions.c \ src/lib_hash/sha2.c \ src/lib_hash/sha2.h \ src/libpng/png.c \ src/libpng/pngconf.h \ src/libpng/pngdebug.h \ src/libpng/pngerror.c \ src/libpng/pngget.c \ src/libpng/png.h \ src/libpng/pnginfo.h \ src/libpng/pnglibconf.h \ src/libpng/pngmem.c \ src/libpng/pngpread.c \ src/libpng/pngpriv.h \ src/libpng/pngread.c \ src/libpng/pngrio.c \ src/libpng/pngrtran.c \ src/libpng/pngrutil.c \ src/libpng/pngset.c \ src/libpng/pngstruct.h \ src/libpng/pngtrans.c \ src/libpng/pngwio.c \ src/libpng/pngwrite.c \ src/libpng/pngwtran.c \ src/libpng/pngwutil.c \ src/protobuf-c/protobuf-cc \ src/protobuf-c/protobuf-ch \ src/utf8proc/utf8proc.c \ src/utf8proc/utf8proc_data.c \ src/utf8proc/utf8proc.h \ src/win_iconv/iconv.h \ src/win_iconv/win_iconv.c \ src/win_spec_incld/dirent.h \ src/win_spec_incld/inttypes.h \ src/win_spec_incld/stdint.h \ src/zlib/adler32.c \ src/zlib/compress.c \ src/zlib/crc32.c \ src/zlib/crc32.h \ src/zlib/deflate.c \ src/zlib/deflate.h \ src/zlib/gzclose.c \ src/zlib/gzguts.h \ src/zlib/gzlib.c \ src/zlib/gzread.c \ src/zlib/gzwrite.c \ src/zlib/infback.c \ src/zlib/inffast.c \ src/zlib/inffast.h \ src/zlib/inffixed.h \ src/zlib/inflate.c \ src/zlib/inflate.h \ src/zlib/inftrees.c \ src/zlib/inftrees.h \ src/zlib/trees.c \ src/zlib/trees.h \ src/zlib/uncompr.c \ src/zlib/zconf.h \ src/zlib/zlib.h \ src/zlib/zutil.c \ src/zlib/zutil.h \ src/zvbi/bcd.h \ src/zvbi/bit_slicer.c \ src/zvbi/bit_slicer.h \ src/zvbi/decoder.c \ src/zvbi/macros.h \ src/zvbi/misc.h \ src/zvbi/raw_decoder.c \ src/zvbi/raw_decoder.h \ src/zvbi/sampling_par.c \ src/zvbi/sampling_par.h \ src/zvbi/sliced.h \ src/zvbi/zvbi_decoder.h ccextractor_CFLAGS =-std=gnu99 -Wno-write-strings -DGPAC_CONFIG_LINUX -D_FILE_OFFSET_BITS=64 -DVERSION_FILE_PRESENT -DENABLE_OCR ccextractor_CPPFLAGS =-I /usr/include/leptonica/ -I /usr/include/tesseract/ -I src/lib_ccx/ -I src/gpacmp4/ -I src/libpng/ -I src/zlib/ -I src/zvbi/ -I src/lib_hash/ -I src/protobuf-c/ -I src/utf8proc/ ccextractor_LDADD =-lm -ltesseract -llept ccextractor_LDFLAGS=-zmuldefs 

src目录tree是:

 . ├── ccextractor.c ├── CCExtractorConfig.h.in ├── ccextractor.o ├── CMakeLists.txt ├── gpacmp4 │  ├── avc_ext.c │  ├── avc_ext.o │  ├── avilib.c │  ├── descriptors.o │  ├── drm_sample.c │  ├── drm_sample.o │  ├── error.c │  ├── error.o │  ├── gpac │  │  ├── avparse.h │  │  ├── base_coding.h │  │  ├── bitstream.h │  │  ├── config_file.h │  │  ├── configuration.h │  │  ├── constants.h │  │  ├── events_constants.h │  │  ├── ietf.h │  │  ├── internal │  │  │  ├── avilib.h │  │  │  ├── isomedia_dev.h │  │  │  ├── media_dev.h │  │  │  ├── odf_dev.h │  │  │  ├── odf_parse_common.h │  │  │  └── ogg.h │  │  ├── isomedia.h │  │  ├── list.h │  │  ├── math.h │  │  ├── media_tools.h │  │  ├── mpeg4_odf.h │  │  ├── network.h │  │  ├── revision.h │  │  ├── setup.h │  │  ├── sync_layer.h │  │  ├── tools.h │  │  ├── utf.h │  │  └── version.h │  ├── gpac_ogg.c │  ├── hinting.c │  ├── ipmpx_code.c │  ├── ipmpx_parse.c │  ├── isom_intern.c │  ├── isom_read.c │  ├── isom_store.c │  ├── isom_write.c │  ├── list.c │  ├── math.c │  ├── media.c │  ├── media_odf.c │  ├── meta.c │  ├── movie_fragments.c │  ├── mp4.c │  ├── odf_code.c │  ├── odf_codec.c │  ├── odf_command.c │  ├── os_config_init.c │  ├── os_divers.c │  ├── os_file.c │  ├── qos.c │  ├── ReadMe.txt │  ├── sample_descs.c │  ├── slc.c │  ├── stbl_read.c │  ├── stbl_write.c │  ├── track.c │  ├── tx3g.c │  ├── url.c │  └── utf.c ├── lib_ccx │  ├── activity.c │  ├── activity.h │  ├── asf_constants.h │  ├── asf_functions.c │  ├── avc_functions.c │  ├── avc_functions.h │  ├── bitstream.h │  ├── hamming.h │  ├── hardsubx.c │  ├── hardsubx_classifier.c │  ├── hardsubx_decoder.c │  ├── hardsubx.h │  ├── hardsubx_imgops.c │  ├── hardsubx_utility.c │  ├── ts_functions.h │  ├── ts_info.c │  ├── ts_tables.c │  ├── ts_tables_epg.c │  ├── utility.c │  ├── utility.h │  ├── wtv_constants.h │  └── wtv_functions.c ├── lib_hash │  ├── README │  ├── sha2.c │  └── sha2.h ├── libpng │  ├── png.c │  ├── pngconf.h │  ├── pngdebug.h │  ├── pngerror.c │  ├── pngget.c │  ├── png.h │  ├── pnginfo.h │  └── pngwutil.c ├── protobuf-c │  ├── protobuf-cc │  └── protobuf-ch ├── utf8proc │  ├── utf8proc.c │  ├── utf8proc_data.c │  └── utf8proc.h ├── win_iconv │  ├── iconv.h │  └── win_iconv.c ├── win_spec_incld │  ├── dirent.h │  ├── inttypes.h │  └── stdint.h ├── zlib │  ├── adler32.c │  ├── compress.c │  ├── crc32.c │  ├── crc32.h │  ├── trees.c │  ├── trees.h │  ├── uncompr.c │  ├── zconf.h │  ├── zlib.h │  ├── zutil.c │  └── zutil.h └── zvbi ├── bcd.h ├── bit_slicer.c ├── bit_slicer.h ├── decoder.c ├── macros.h ├── misc.h ├── raw_decoder.c ├── raw_decoder.h 

而且,所有的包含都是在src子目录中的完整path完成的,就像gpacmp4目录下的文件#include <gpac/avparse.h> 。 除了主ccextractor.c文件之外,所有-I flags都被提供。

即使是最细微的帮助也是值得赞赏的。

以下是一些调用的初始语句:

 gcc -DHAVE_CONFIG_H -I. -I /usr/include/leptonica/ -I /usr/include/tesseract/ -I src/lib_ccx/ -I src/gpacmp4/ -I src/libpng/ -I src/zlib/ -I src/zvbi/ -I src/lib_hash/ -I src/protobuf-c/ -I src/utf8proc/ -std=gnu99 -Wno-write-strings -DGPAC_CONFIG_LINUX -D_FILE_OFFSET_BITS=64 -DVERSION_FILE_PRESENT -DENABLE_OCR -g -O2 -MT src/ccextractor-ccextractor.o -MD -MP -MF src/.deps/ccextractor-ccextractor.Tpo -c -o src/ccextractor-ccextractor.o `test -f 'src/ccextractor.c' || echo './'`src/ccextractor.c mv -f src/gpacmp4/.deps/ccextractor-avc_ext.Tpo src/gpacmp4/.deps/ccextractor-avc_ext.Po gcc -DHAVE_CONFIG_H -I. -I /usr/include/leptonica/ -I /usr/include/tesseract/ -I src/lib_ccx/ -I src/gpacmp4/ -I src/libpng/ -I src/zlib/ -I src/zvbi/ -I src/lib_hash/ -I src/protobuf-c/ -I src/utf8proc/ -std=gnu99 -Wno-write-strings -DGPAC_CONFIG_LINUX -D_FILE_OFFSET_BITS=64 -DVERSION_FILE_PRESENT -DENABLE_OCR -g -O2 -MT src/gpacmp4/ccextractor-avilib.o -MD -MP -MF src/gpacmp4/.deps/ccextractor-avilib.Tpo -c -o src/gpacmp4/ccextractor-avilib.o `test -f 'src/gpacmp4/avilib.c' || echo './'`src/gpacmp4/avilib.c mv -f src/gpacmp4/.deps/ccextractor-avilib.Tpo src/gpacmp4/.deps/ccextractor-avilib.Po 

在显示未定义参考错误之前调用的语句:

 gcc -std=gnu99 -Wno-write-strings -DGPAC_CONFIG_LINUX -D_FILE_OFFSET_BITS=64 -DVERSION_FILE_PRESENT -DENABLE_OCR -g -O2 -zmuldefs -o ccextractor src/ccextractor-ccextractor.o src/gpacmp4/ccextractor-avc_ext.o src/gpacmp4/ccextractor-avilib.o src/gpacmp4/ccextractor-av_parsers.o src/gpacmp4/ccextractor-base_encoding.o src/gpacmp4/ccextractor-bitstream.o src/gpacmp4/ccextractor-box_code_3gpp.o src/gpacmp4/ccextractor-box_code_adobe.o src/gpacmp4/ccextractor-box_code_apple.o src/gpacmp4/ccextractor-box_code_base.o src/gpacmp4/ccextractor-box_code_drm.o src/gpacmp4/ccextractor-box_code_meta.o src/gpacmp4/ccextractor-box_funcs.o src/gpacmp4/ccextractor-configfile.o src/gpacmp4/ccextractor-data_map.o src/gpacmp4/ccextractor-desc_private.o src/gpacmp4/ccextractor-descriptors.o src/gpacmp4/ccextractor-drm_sample.o src/gpacmp4/ccextractor-error.o -lm -ltesseract -llept /media/mayank/Mayank/GSOC 2017/Projects/ccextractor/src/ccextractor.c:32: undefined reference to `mprint' /media/mayank/Mayank/GSOC 2017/Projects/ccextractor/src/ccextractor.c:33: undefined reference to `change_filename_requested' src/ccextractor-ccextractor.o: In function `main': /media/mayank/Mayank/GSOC 2017/Projects/ccextractor/src/ccextractor.c:68: undefined reference to `init_options' /media/mayank/Mayank/GSOC 2017/Projects/ccextractor/src/ccextractor.c:123: undefined reference to `params_dump' src/gpacmp4/ccextractor-drm_sample.o: In function `gf_isom_ipmpx_remove_tool_list': /media/mayank/Mayank/GSOC 2017/Projects/ccextractor/src/gpacmp4/drm_sample.c:1421: undefined reference to `gf_odf_desc_del' collect2: error: ld returned 1 exit status Makefile:497: recipe for target 'ccextractor' failed make[1]: *** [ccextractor] Error 1 make[1]: Leaving directory '/media/mayank/Mayank/GSOC 2017/Projects/ccextractor' Makefile:335: recipe for target 'all' failed make: *** [all] Error 2 

PS:任何帮助表示赞赏。我尝试了许多事情,包括更改代码中#include <path/to/header>语句的#include <path/to/header> ,然后在CPPFLAGS为这些path添加-I语句,但这也没有帮助。 几乎所有未定义的引用错误都来自驻留在目录的子目录中的头文件中声明的函数,比如src/dir/subdir-I标志只添加到src/dir/ ,然后src/dir/的文件像#include<subdir/filename.h>这样的语句。

PPS:我使用了grep -r "<Name_of_function_leading_to_error>" .src中找出声明头文件。

未定义的引用意味着缺少库或错误​​的库命令。 所以改变-I标志没有效果。

  1. 找出哪个库包含符号
  2. 检查它们是否在链接器上,如果它们丢失,就添加它们
  3. 如果他们在接线上,请验证订单是否正确