必须包含存在 file.h "#include "的所有"file.o"文件" "



我试图调试omxplayer时,进行了大量的交叉编译。该文件是从这里下载的。不幸的是,有超过5000个文件,所以我无法上传目录树。下面是发出的make命令:

/path/to/cross/compiler/arm-bcm2708/gcc linaro arm linux gneabihf raspbian/bin/arm-linux-gneabiHF-g++--sysroot=/mnt/root-Wall-L/mnt/root/lib-L/mnt/root/lib-L/mnt/root/L/mnt/root/usr/lib/ommxplayer-L/mnt/root/opt/vc/lib-L/mnt/rot/usr/lib/arm linux gneabi hf-L/-ldbus-1-lc-lWFC-lGLESv2-lEGL-lbcm_host-lopenmaxil-lfreetype-lz-Lffmpeg_compiled/usr/local/lib/-o omxplayer.bin linux/XMemUtils.o utils/log.o DynamicDll.o utils/PCMRemap.o utils/RegExp.o OMXSubtitleTagSami.o OMXOverlayCodecText.o BitstreamConverter.o linux/RBP.o OMXThread.o OMXReader.o OMXStreamInfo.o OMXAudioCodecOMX.o OMXC ore.o OMX视频.o OMXAudio.o OMXClock.o文件.o OMXPlayerVideo.oOMXPlayerAudio.o OMXPlayerSubtitles.o SubtitleRenderer.o Unicode.o Srt.o KeyConfig.o OMXControl.o Keyboard.o omxplayer.o-lvchiq_arm-lvcos-lrt-lpthread-lavutil-lavcodec-lavcormat-lavdevice-lavfilter-lswscale-lsreseample-lpcre ./arm-linux-gnueabihf-pkg-config --libs dbus-1-lrt

但后来我得到了以下错误:

/path/to/cross/compiler/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin/../lib/gcc/arm-linux-gnueabihf/4.7.2/../../../../arm-linux-gnueabihf/bin/ld: warning: libavutil.so.51, needed by /mnt/root/usr/lib/arm-linux-gnueabihf/libpostproc.so.52, may conflict with libavutil.so.52
BitstreamConverter.o: In function `DllAvUtilBase::av_frame_move_ref(AVFrame*, AVFrame*)':
BitstreamConverter.cpp:(.text._ZN13DllAvUtilBase17av_frame_move_refEP7AVFrameS1_[_ZN13DllAvUtilBase17av_frame_move_refEP7AVFrameS1_]+0x8): undefined reference to `av_frame_move_ref'
BitstreamConverter.o: In function `DllAvUtilBase::av_frame_unref(AVFrame*)':
BitstreamConverter.cpp:(.text._ZN13DllAvUtilBase14av_frame_unrefEP7AVFrame[_ZN13DllAvUtilBase14av_frame_unrefEP7AVFrame]+0x4): undefined reference to `av_frame_unref'
BitstreamConverter.o: In function `DllAvUtilBase::av_frame_alloc()':
BitstreamConverter.cpp:(.text._ZN13DllAvUtilBase14av_frame_allocEv[_ZN13DllAvUtilBase14av_frame_allocEv]+0x0): undefined reference to `av_frame_alloc'
BitstreamConverter.o: In function `DllAvUtilBase::av_frame_free(AVFrame**)':
BitstreamConverter.cpp:(.text._ZN13DllAvUtilBase13av_frame_freeEPP7AVFrame[_ZN13DllAvUtilBase13av_frame_freeEPP7AVFrame]+0x4): undefined reference to `av_frame_free'
collect2: error: ld returned 1 exit status
make: *** [omxplayer.bin] Error 1

我将av_frame_unref函数和其他函数追溯到frame.h,它在ffmpeg_compiled/usr/local/include/libavutil/frame.hffmpeg/libavutil/frame.h中。通常,我会使用-lframe-Lffmpeg/libavutil/ -lframe链接到.so库,但这不是共享库(.so文件),而是对象文件(.o文件)。我确信我不必手动链接这些,这就是make文件的用途。任何人都会对正在发生的事情有所了解。此外,我将在下面包含我的Makefile(我还有一个Makefile.include,其中显示了交叉编译选项,如果需要,我也可以发布)

生成文件:

SRC=linux/XMemUtils.cpp 
        utils/log.cpp 
        DynamicDll.cpp 
        utils/PCMRemap.cpp 
        utils/RegExp.cpp 
        OMXSubtitleTagSami.cpp 
        OMXOverlayCodecText.cpp 
        BitstreamConverter.cpp 
        linux/RBP.cpp 
        OMXThread.cpp 
        OMXReader.cpp 
        OMXStreamInfo.cpp 
        OMXAudioCodecOMX.cpp 
        OMXCore.cpp 
        OMXVideo.cpp 
        OMXAudio.cpp 
        OMXClock.cpp 
        File.cpp 
        OMXPlayerVideo.cpp 
        OMXPlayerAudio.cpp 
        OMXPlayerSubtitles.cpp 
        SubtitleRenderer.cpp 
        Unicode.cpp 
        Srt.cpp 
        KeyConfig.cpp 
        OMXControl.cpp 
        Keyboard.cpp 
        omxplayer.cpp 
OBJS+=$(filter %.o,$(SRC:.cpp=.o))
all: omxplayer.bin
%.o: %.cpp
    @rm -f $@ 
    $(CXX) $(CFLAGS) $(INCLUDES) -c $< -o $@ -Wno-deprecated-declarations
version:
    bash gen_version.sh > version.h 
omxplayer.bin: version $(OBJS)
    $(CXX) $(LDFLAGS) -o omxplayer.bin $(OBJS) -lvchiq_arm -lvcos -lrt -lpthread -lavutil -lavcodec -lavformat -lavdevice -lavfilter -lswscale -lswresample -lpcre `./arm-linux-gnueabihf-pkg-config --libs dbus-1` -lrt
    #arm-unknown-linux-gnueabi-strip omxplayer.bin
clean:
    for i in $(OBJS); do (if test -e "$$i"; then ( rm $$i ); fi ); done
    @rm -f omxplayer.old.log omxplayer.log
    @rm -f omxplayer.bin
    @rm -rf $(DIST)
    @rm -f omxplayer-dist.tar.gz
ffmpeg:
    @rm -rf ffmpeg
    make -f Makefile.ffmpeg
    make -f Makefile.ffmpeg install
dist: omxplayer.bin
    mkdir -p $(DIST)/usr/lib/omxplayer
    mkdir -p $(DIST)/usr/bin
    mkdir -p $(DIST)/usr/share/doc
    cp omxplayer omxplayer.bin $(DIST)/usr/bin
    cp COPYING $(DIST)/usr/share/doc/
    cp README.md $(DIST)/usr/share/doc/README
    cp -a ffmpeg_compiled/usr/local/lib/*.so* $(DIST)/usr/lib/omxplayer/
    tar -czf omxplayer-dist.tar.gz $(DIST)

看起来您需要在编译时从.o文件中提取函数定义。我发现这篇文章非常有助于解释这背后的理论:

http://eli.thegreenplace.net/2013/07/09/library-order-in-static-linking/

关于链接和编译的更多信息,我也强烈推荐这本书:http://www.network-theory.co.uk/docs/gccintro/index.html

我四处走动,mule开始在g++之后添加foo/bar.o指令,幸运的是,我只需要放置其中两个:ffmpeg/libavutil/frame.offmpeg/libavutil/buffer.o。我终于安装了omxplayer。注意,如果说Linux教会了我什么,那就是编译并不意味着它会工作

事后看来,这是完全合理的,我以前也应该这么做,问题是大多数网站要么处理极其琐碎的情况,比如g++ -o foo.o bar.o,要么处理极其复杂的情况,即您将pkg-config重新定义为具有交叉编译功能,然后在使用之前设置十几个标志。我发现这些大的Makefile对于新手程序员来说总是很难处理。

相关内容

最新更新