必须包含存在 file.h "#include "的所有"file.o"文件" "
Must one include all "file.o" files where there is "#include "file.h" "
我试图调试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.h
和ffmpeg/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.o
和ffmpeg/libavutil/buffer.o
。我终于安装了omxplayer。注意,如果说Linux教会了我什么,那就是编译并不意味着它会工作。
事后看来,这是完全合理的,我以前也应该这么做,问题是大多数网站要么处理极其琐碎的情况,比如g++ -o foo.o bar.o
,要么处理极其复杂的情况,即您将pkg-config
重新定义为具有交叉编译功能,然后在使用之前设置十几个标志。我发现这些大的Makefile对于新手程序员来说总是很难处理。
- 如何在从文件中读取整数时使用 file.eof()?
- 使用 sftp_open() 使用 C++ 中的 SFTP libssh 将文件从本地复制到远程时,File 返回 N
- make 命令创建 .file,但不创建应用程序文件
- 为什么 VScode 在 .h 文件中显示"'iostream' file not found"?
- fopen 在创建大量文件后因 EFBIG "File too large" 而失败
- 从生成文件编译错误:"Unable to open output file" ..."No such file or directory"
- 进口。TLB文件给出"cannot open source file x.tlh"
- GetPrivateProfileStringA 返回"The system cannot find the file specified."即使文件存在
- 成功使用CMakeLists制作后如何修复"open: No such file or directory"错误(该文件实际上存在)
- 使用 getline 和 FILE 而不是 ifstream 的 c++ 读取文件
- 尝试使用生成文件编译程序时"fatal error: boost/regex.hpp: No such file or directory" C++
- 我的文件可以编译,但当我尝试运行它时"no such file or directory"
- 无法使用 Qt: "No such file or directory" 打开包含文件
- 为什么打开许多文件时"open file failed"?
- ": No such file or directory"执行外壳文件
- 已安装 SDK 的头文件的"Cannot open source file"
- 程序在尝试将 file.read() 文件() 到新变量时停止工作
- 读取视频文件"Open CV WARNING: Couldn't read movie file bird.avi"时出现问题
- 将CPP类(.CPP文件)转换为C结构(.c File)
- 必须包含存在 file.h "#include "的所有"file.o"文件" "