必须包含所有“file.o”文件,其中有“#include”file.h“”

时间:2013-12-03 00:30:56

标签: c++ installation g++ makefile cross-compiling

我正在尝试调试omxplayer的大量交叉编译。该文件从here下载。不幸的是,有超过5000个文件,所以我无法上传目录树。这是发出的make命令:

  

/ path / to / cross / compiler / arm-bcm2708 / gcc-linaro-arm-linux-gnueabihf-raspbian / bin / arm-linux-gnueabihf-g ++ --sysroot = / mnt / root -Wall -L / mnt / root / lib -L ​​/ mnt / root / lib -L ​​/ mnt / root / usr / lib -L ​​/ mnt / root / usr / lib / omxplayer -L / mnt / root / opt / vc / lib -L ​​/ mnt / root / usr / lib / arm-linux-gnueabihf -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 OMXCore.o OMXVideo.o OMXAudio.o OMXClock.o File.o OMXPlayerVideo.o OMXPlayerAudio.o OMXPlayerSubtitles.o SubtitleRenderer.o Unicode.o Srt.o KeyConfig.o OMXControl.o Keyboard.o omxplayer.o -lvchiq_arm -lvcos - lrt -lpthread -lavutil -lavcodec -lavformat -lavdevice -lavfilter -lswscale -lswresample -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.hffmpeg_compiled/usr/local/include/libavutil/frame.h中的ffmpeg/libavutil/frame.h。通常我会使用.so-lframe链接到-Lffmpeg/libavutil/ -lframe库,但是,这不是共享库(.so文件),而是目标文件({{1} }文件)。我很确定我不必手动链接这些,这就是make文件的用途。任何人都可以了解正在发生的事情。另外,我将在下面包含我的Makefile(我还有一个Makefile.include显示交叉编译选项,我可以在必要时发布它)

生成文件:

.o

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

我四处走动,在foo/bar.o之后开始添加g++说明,幸运的是我只需要输入其中的两个:ffmpeg/libavutil/frame.offmpeg/libavutil/buffer.o。我终于安装了omxplayer。请注意,如果Linux教会了我任何东西,那只是因为编译并不意味着它将工作

事后看来,这是完全合理的,我之前应该已经完成​​了,问题是大多数网站要么处理疯狂的微不足道的情况,比如g++ -o foo.o bar.o,要么是你要重新定义pkg-config的非常复杂的情况具有交叉编译能力,然后在使用之前设置十几个标志。我发现这些大型Makefile总是难以为新手程序员处理。