首页 文章

Ffmpeg使用CMake链接问题

提问于
浏览
1

我正在编写一个包含2个内部库的应用程序,并且依赖于更多2个外部库(ffmpeg和opencv) . 我也在使用CMake生成UNIX makefile . 问题是当我尝试构建源代码时,它会编译,但根本不与ffmpeg链接,链接器提供的下一个输出:

../../Decoder/libDecoder.a(ConverterAVFrameToRGB.cpp.o): In function `FaceVideo::ConverterAVFrameToRGB::to_rgb_conversion(std::vector<AVFrame*, std::allocator<AVFrame*> >&, int, int, int)':
ConverterAVFrameToRGB.cpp:(.text+0x990): undefined reference to `av_frame_free'
../../Decoder/libDecoder.a(FfmpegDecoder.cpp.o): In function `FaceVideo::FfmpegDecoder::destroy()':
FfmpegDecoder.cpp:(.text+0xa30): undefined reference to `av_frame_free'
../../Decoder/libDecoder.a(FfmpegDecoder.cpp.o): In function `FaceVideo::FfmpegDecoder::decode_next_chunk(int)':
FfmpegDecoder.cpp:(.text+0xb6b): undefined reference to `av_frame_clone'
FfmpegDecoder.cpp:(.text+0xc13): undefined reference to `av_frame_free'
../../Decoder/libDecoder.a(FfmpegEncoder.cpp.o): In function `FaceVideo::FfmpegEncoder::destroy()':
FfmpegEncoder.cpp:(.text+0x132): undefined reference to `avcodec_free_frame'
../../Decoder/libDecoder.a(FfmpegEncoder.cpp.o): In function `FaceVideo::FfmpegEncoder::encode()':
FfmpegEncoder.cpp:(.text+0x4c4): undefined reference to `avcodec_encode_video2'
FfmpegEncoder.cpp:(.text+0x592): undefined reference to `avcodec_encode_video2'
../../Decoder/libDecoder.a(FrameSaver.cpp.o): In function `FaceVideo::FrameSaver::saver(std::vector<AVFrame*, std::allocator<AVFrame*> >&, int, int, int)':
FrameSaver.cpp:(.text+0x869): undefined reference to `av_frame_free'
collect2: ld returned 1 exit status

这是我不想看到的 .

有三个Cmake文件:两个用于内部库(使用

add_library(Decoder ${SOURCES_DECODER})
             and 
add_library(Detector ${SOURCES_DETECTOR})

在他们)和一个主要可执行文件(使用

add_executable(Tool ${SOURCES_TOOL})
             and
target_link_libraries (Tool Decoder avutil avcodec swscale avformat Detector ${OpenCV_LIBS})

在里面) .

据我所知,从CMake手册和示例中,这应该使链接器将这些库链接在一起,但没有效果 .

我一直在尝试很多东西,比如:
1)添加带有库的路径的 link_directories() (/ usr / lib / x86_64-linux-gnu /对我来说),无论哪里都没有改变 .
2)分别链接每个库,我的意思是我尝试在我的内部库CMake文件中执行类似的操作: target_link_libraries (Decoder avutil avcodec swscale avformat) . 然后将库链接到我的Tool CMake文件中: target_link_libraries (Tool Decoder Detector) .
3)编辑输出makefile .
4)编译简单的单文件应用程序只是为了测试我是否可以这样做 . 我可以 . g++ -lavcodec -o out mysource.cpp 完美无缺 .
5)手动编译ffmpeg并安装它 .

事实是我真的不知道该怎么办 . 我不知道 . 我非常感谢你的每一个答案 .

UPD1: 设置CMAKE_VERBOSE_MAKEFILE时的输出

! / usr / bin / c -march = x86-64 -Wall -fPIC -pthread -std = c 0x -D__STDC_CONSTANT_MACROS -march = x86-64 -fPIC CMakeFiles / FaceDetectorTool.dir / home / anton / Programming / facevideo / branches / Stream_Prototype /src/tools/FaceDetectorTool/facedetector.cpp.o -o FaceDetectorTool -rdynamic ../../Detector/libDetector.a ../../Decoder/libDecoder.a -lavutil -lavcodec -lswscale -lavformat / usr / local / lib / libopencv_videostab.so.2.4.7 /usr/local/lib/libopencv_video.so.2.4.7 /usr/local/lib/libopencv_ts.a /usr/local/lib/libopencv_superres.so.2.4.7 / usr / local / lib / libopencv_stitching.so.2.4.7 /usr/local/lib/libopencv_photo.so.2.4.7 /usr/local/lib/libopencv_ocl.so.2.4.7 / usr / local / lib / libopencv_objdetect . so.2.4.7 /usr/local/lib/libopencv_nonfree.so.2.4.7 /usr/local/lib/libopencv_ml.so.2.4.7 /usr/local/lib/libopencv_legacy.so.2.4.7 / usr / local / lib / libopencv_imgproc.so.2.4.7 /usr/local/lib/libopencv_highgui.so.2.4.7 /usr/local/lib/libopencv_gpu.so.2.4.7 /usr/local/lib/libopencv_flann.so . 2.4.7 / usr / local / lib / libopencv_fea tures2d.so.2.4.7 /usr/local/lib/libopencv_core.so.2.4.7 /usr/local/lib/libopencv_contrib.so.2.4.7 /usr/local/lib/libopencv_calib3d.so.2.4.7 - ldl -lm -lpthread -lrt /usr/local/lib/libopencv_nonfree.so.2.4.7 /usr/local/lib/libopencv_ocl.so.2.4.7 /usr/local/lib/libopencv_gpu.so.2.4.7 / usr / local / lib / libopencv_photo.so.2.4.7 /usr/local/lib/libopencv_objdetect.so.2.4.7 /usr/local/lib/libopencv_legacy.so.2.4.7 / usr / local / lib / libopencv_video . so.2.4.7 /usr/local/lib/libopencv_ml.so.2.4.7 /usr/local/lib/libopencv_calib3d.so.2.4.7 /usr/local/lib/libopencv_features2d.so.2.4.7 / usr / local / lib / libopencv_highgui.so.2.4.7 /usr/local/lib/libopencv_imgproc.so.2.4.7 /usr/local/lib/libopencv_flann.so.2.4.7 /usr/local/lib/libopencv_core.so . 2.4.7 -Wl,-rpath,/ usr / local / lib

UPD2 Cmake示例看起来像那样 .

cmake_minimum_required (VERSION 2.8)
project (Decoder)
include(../CMakeInit.cmake)
include_directories(${FFMPEG_INCLUDE_DIR})
include_directories(${Stream_Facevideo_SOURCE_DIR}/../src/kernel/decoder/)
include_directories(${Stream_Facevideo_SOURCE_DIR}/../src/kernel/stuff/)
set(SOURCES_VIDEODECODER
            *sources*
  )

if(WINDOWS)
    set(SOURCES_VIDEODECODER    ${SOURCES_VIDEODECODER} 
            *headers*                           
    )
endif(WINDOWS)

set (SOURCES_DECODER
    ${SOURCES_VIDEODECODER}
)

add_library(Decoder ${SOURCES_DECODER})
link_directories("/usr/lib/x86_64-linux-gnu/")
target_link_libraries(Decoder swscale avformat avcodec avutil)

2 回答

  • 0

    似乎这个解决方案应该有效:Findavutil.cmakeCMakeLists.txt

  • 0

    您的问题似乎忘了为ffmpeg lib添加LINK_DIRECTORIES .

    如果没关系,那么尝试更改target_link_libraries中可执行文件的链接顺序,或者为内部库添加target_link_libraries,使用外部库 .

相关问题