Конфигурация CMake для ffmpeg в проекте C ++ - PullRequest
0 голосов
/ 08 июня 2018

Я установил ffmpeg (версия 4) с Homebrew, и я пытаюсь использовать различные библиотеки ffmpeg в проекте C ++, но я получаю несколько ошибок во время компоновки.

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:

И так далее ...

Я включил библиотеки следующим образом

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?

Спасибо,

Ответы [ 2 ]

0 голосов
/ 08 июня 2018

Хорошо, я нашел решение.Похоже, что FFmpeg не поддерживает find_package в CMake.Мне пришлось вручную связать библиотеки, как предложено здесь .

Final 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})

Я уверен, что есть лучший способ объединить все библиотеки.

0 голосов
/ 08 июня 2018

Вам нужно указать CMAKE, где найти заголовки и библиотеки для ffmpeg в вашей системе.Вы можете использовать find_package(ffmpeg для поиска вашей системы, а затем использовать переменные CMAKE, которые она определяет, для правильной настройки заголовков для компилятора и библиотек для компоновщика.

  • header: include_directories(${FFMPEG_INCLUDE_DIRS})
  • библиотеки: target_link_libraries(decode_encode ${FFMPEG_LIBRARIES})

Что-то похожее на следующее должно служить цели.

 cmake_minimum_required(VERSION 2.6)
project(decode_encode)

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


find_package(FFmpeg COMPONENTS AVCODEC AVFORMAT AVUTIL AVDEVICE REQUIRED) #add here the list of ffmpeg components required

if(FFMPEG_FOUND)
#  FFMPEG_INCLUDE_DIRS  - Include directory necessary for using the required components headers.
#  FFMPEG_LIBRARIES     - Link these to use the required ffmpeg components.
#  FFMPEG_DEFINITIONS   - Compiler switches required for using the required ffmpeg components.
    message("FFMPEG_INCLUDE_DIRS = ${FFMPEG_INCLUDE_DIRS} ")
    message("FFMPEG_LIBRARIES = ${FFMPEG_LIBRARIES} ")
    message("FFMPEG_DEFINITIONS = ${FFMPEG_DEFINITIONS} ")

    include_directories(${FFMPEG_INCLUDE_DIRS})

endif()


add_executable(decode_encode main.cpp)
target_link_libraries(decode_encode ${FFMPEG_LIBRARIES})

ПРИМЕЧАНИЕ Я не пробовал этого, поэтому вам может понадобиться настроить его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...