web-dev-qa-db-ja.com

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:

等々 ...

私は次のようにライブラリを含めました

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ファイルのリンク部分を処理するためのより良い方法はありますか?

ありがとう、

5
pp492

わかりました、私は解決策を見つけました。 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})

ただし、すべてのライブラリを集約するためのより良い方法があると確信しています。

5
pp492

システム内のCMAKEのヘッダーとライブラリの場所をffmpegに指示する必要があります。 _find_package(ffmpeg_を使用してシステムを調べ、定義されているCMAKE変数を使用して、コンパイラーのヘッダーとリンカーのライブラリーを正しくセットアップできます。

  • ヘッダー: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})
_

[〜#〜] note [〜#〜]これは試したことがないので、微調整する必要があるかもしれません。

1
Davide Spataro