C项目中ffmpeg的CMake配置

新手上路,请多包涵

我已经使用 Homebrew 安装了 ffmpeg(第 4 版),我正在尝试在 C++ 项目中使用各种 ffmpeg 库,但在链接过程中出现多个错误。

 Undefined symbols for architecture x86_64:
  "_av_free", referenced from:
      _main in main.cpp.o
  "_av_packet_alloc", referenced from:
      _main in main.cpp.o
  "_av_parser_init", referenced from:
And so on ...

我已包含以下库

extern "C" {
    #include <libavutil/frame.h>
    #include <libavutil/mem.h>
    #include <libavcodec/avcodec.h>
}

但是,这仍然行不通。我想我可能在我的 CMakeLists.txt 文件中遗漏了一些东西,目前看起来像这样:

 cmake_minimum_required(VERSION 2.6)
project(decode_encode)

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_FLAGS "-D__STDC_CONSTANT_MACROS")

add_executable(decode_encode main.cpp)

我很可能需要指定其他链接标志,但是有没有更好的方法来处理 CMakeLists.txt 文件中的链接部分?

原文由 pp492 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 2k
2 个回答

好的,我找到了解决方案。看来 FFmpeg 不支持 CMake 中的 find_package 。我必须按照 这里 的建议手动链接库。

最终的 CMakeLists.txt 看起来像这样

cmake_minimum_required(VERSION 2.6)
project(decode_encode)

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_FLAGS "-D__STDC_CONSTANT_MACROS")

find_path(AVCODEC_INCLUDE_DIR libavcodec/avcodec.h)
find_library(AVCODEC_LIBRARY avcodec)

find_path(AVFORMAT_INCLUDE_DIR libavformat/avformat.h)
find_library(AVFORMAT_LIBRARY avformat)

find_path(AVUTIL_INCLUDE_DIR libavutil/avutil.h)
find_library(AVUTIL_LIBRARY avutil)

find_path(AVDEVICE_INCLUDE_DIR libavdevice/avdevice.h)
find_library(AVDEVICE_LIBRARY avdevice)

add_executable(decode_encode main.cpp)
target_include_directories(decode_encode PRIVATE ${AVCODEC_INCLUDE_DIR} ${AVFORMAT_INCLUDE_DIR} ${AVUTIL_INCLUDE_DIR} ${AVDEVICE_INCLUDE_DIR})
target_link_libraries(decode_encode PRIVATE ${AVCODEC_LIBRARY} ${AVFORMAT_LIBRARY} ${AVUTIL_LIBRARY} ${AVDEVICE_LIBRARY})

不过,我确信有更好的方法来聚合所有库。

原文由 pp492 发布,翻译遵循 CC BY-SA 4.0 许可协议

PkgConfig 可用于更方便地链接库,如评论中所述。使用 CMake 3.17,这将链接所有 libav 库:

 cmake_minimum_required(VERSION 3.17)

project(Foo)

find_package(PkgConfig REQUIRED)
pkg_check_modules(LIBAV REQUIRED IMPORTED_TARGET
    libavdevice
    libavfilter
    libavformat
    libavcodec
    libswresample
    libswscale
    libavutil
)

add_executable(${PROJECT_NAME}
    main.cpp
)

target_link_libraries(${PROJECT_NAME}
    PkgConfig::LIBAV
)

原文由 Kasdonchu 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题