cmake_minimum_required(VERSION 3.20)
project(ffmpeg C)
set(CMAKE_C_STANDARD 11)
set(CMAKE_BUILD_TYPE Debug)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
Debug编译选项(兼容 Apple ld)
set(CMAKE_C_FLAGS_DEBUG "-g -O0 -DDEBUG -fno-omit-frame-pointer")
包含头文件路径
include_directories(
${CMAKE_SOURCE_DIR}
${CMAKE_SOURCE_DIR}/ffbuild
)
============================================================================
重要说明:
由于 macOS 上 GCC 14 的 fixincludes 问题(找不到 _bounds.h),
我们使用混合方案:
1. 用 make 编译源码(FFmpeg 的 configure 会自动处理兼容性问题)
2. CMake 直接链接已编译的 .o 文件
3. 这样既能调试,又避免了 GCC/macOS 的兼容性问题
============================================================================
使用已编译的 .o 文件创建可执行文件
add_executable(ffmpeg_debug
${CMAKE_CURRENT_BINARY_DIR}/dummy.c
)
add_executable(ffprobe_debug
${CMAKE_CURRENT_BINARY_DIR}/dummy.c
)
创建dummy.c文件
file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/dummy.c
"// Dummy file for CMake
// Actual linking uses pre-compiled .o files from make
")
收集所有make编译好的.o文件
file(GLOB FFMPEG_OBJECTS
fftools/ffmpeg.o
fftools/ffmpeg_*.o
fftools/cmdutils.o
fftools/opt_common.o
fftools/sync_queue.o
fftools/thread_queue.o
)
file(GLOB TEXTFORMAT_OBJECTS
fftools/textformat/*.o
)
file(GLOB GRAPH_OBJECTS
fftools/graph/*.o
)
file(GLOB RESOURCES_OBJECTS
fftools/resources/*.o
)
set(FFPROBE_OBJECTS
fftools/ffprobe.o
fftools/cmdutils.o
fftools/opt_common.o
)
macOS 系统框架
find_library(COREFOUNDATION_FRAMEWORK CoreFoundation)
find_library(COREMEDIA_FRAMEWORK CoreMedia)
find_library(COREVIDEO_FRAMEWORK CoreVideo)
find_library(VIDEOTOOLBOX_FRAMEWORK VideoToolbox)
find_library(AUDIOTOOLBOX_FRAMEWORK AudioToolbox)
find_library(COREAUDIO_FRAMEWORK CoreAudio)
find_library(AVFOUNDATION_FRAMEWORK AVFoundation)
find_library(COREIMAGE_FRAMEWORK CoreImage)
find_library(APPKIT_FRAMEWORK AppKit)
find_library(CORESERVICES_FRAMEWORK CoreServices)
find_library(SECURITY_FRAMEWORK Security)
find_library(COREGRAPHICS_FRAMEWORK CoreGraphics)
find_library(OPENGL_FRAMEWORK OpenGL)
链接时使用make编译好的.o文件
target_link_libraries(ffmpeg_debug
${FFMPEG_OBJECTS}
${TEXTFORMAT_OBJECTS}
${GRAPH_OBJECTS}
${RESOURCES_OBJECTS}
${CMAKE_SOURCE_DIR}/libavformat/libavformat.a
${CMAKE_SOURCE_DIR}/libavcodec/libavcodec.a
${CMAKE_SOURCE_DIR}/libavfilter/libavfilter.a
${CMAKE_SOURCE_DIR}/libavdevice/libavdevice.a
${CMAKE_SOURCE_DIR}/libswscale/libswscale.a
${CMAKE_SOURCE_DIR}/libswresample/libswresample.a
${CMAKE_SOURCE_DIR}/libavutil/libavutil.a
macOS 框架
${COREFOUNDATION_FRAMEWORK}
${COREMEDIA_FRAMEWORK}
${COREVIDEO_FRAMEWORK}
${VIDEOTOOLBOX_FRAMEWORK}
${AUDIOTOOLBOX_FRAMEWORK}
${COREAUDIO_FRAMEWORK}
${AVFOUNDATION_FRAMEWORK}
${COREIMAGE_FRAMEWORK}
${APPKIT_FRAMEWORK}
${CORESERVICES_FRAMEWORK}
${SECURITY_FRAMEWORK}
${COREGRAPHICS_FRAMEWORK}
${OPENGL_FRAMEWORK}
标准库
m z pthread iconv bz2 lzma
)
target_link_libraries(ffprobe_debug
${FFPROBE_OBJECTS}
${TEXTFORMAT_OBJECTS}
${RESOURCES_OBJECTS}
${CMAKE_SOURCE_DIR}/libavformat/libavformat.a
${CMAKE_SOURCE_DIR}/libavcodec/libavcodec.a
${CMAKE_SOURCE_DIR}/libavfilter/libavfilter.a
${CMAKE_SOURCE_DIR}/libavdevice/libavdevice.a
${CMAKE_SOURCE_DIR}/libswscale/libswscale.a
${CMAKE_SOURCE_DIR}/libswresample/libswresample.a
${CMAKE_SOURCE_DIR}/libavutil/libavutil.a
macOS 框架
${COREFOUNDATION_FRAMEWORK}
${COREMEDIA_FRAMEWORK}
${COREVIDEO_FRAMEWORK}
${VIDEOTOOLBOX_FRAMEWORK}
${AUDIOTOOLBOX_FRAMEWORK}
${COREAUDIO_FRAMEWORK}
${AVFOUNDATION_FRAMEWORK}
${COREIMAGE_FRAMEWORK}
${APPKIT_FRAMEWORK}
${CORESERVICES_FRAMEWORK}
${SECURITY_FRAMEWORK}
${COREGRAPHICS_FRAMEWORK}
${OPENGL_FRAMEWORK}
标准库
m z pthread iconv bz2 lzma
)
============================================================================
以下部分用于IDE代码导航和跳转
添加所有源文件作为库的OBJECT目标,这样可以在CLion中浏览和跳转代码
但设置为EXCLUDE_FROM_ALL,不实际编译
============================================================================
fftools 源文件(用于代码导航)
file(GLOB_RECURSE FFTOOLS_SOURCES fftools/*.c)
库源文件(用于代码导航)
file(GLOB_RECURSE AVCODEC_SOURCES libavcodec/.c)
file(GLOB_RECURSE AVFORMAT_SOURCES libavformat/ .c)
file(GLOB_RECURSE AVUTIL_SOURCES libavutil/.c)
file(GLOB_RECURSE AVFILTER_SOURCES libavfilter/ .c)
file(GLOB_RECURSE AVDEVICE_SOURCES libavdevice/.c)
file(GLOB_RECURSE SWSCALE_SOURCES libswscale/ .c)
file(GLOB_RECURSE SWRESAMPLE_SOURCES libswresample/*.c)
创建用于代码导航的虚拟目标(不编译)
add_library(fftools_src OBJECT ${FFTOOLS_SOURCES})
add_library(avcodec_src OBJECT ${AVCODEC_SOURCES})
add_library(avformat_src OBJECT ${AVFORMAT_SOURCES})
add_library(avutil_src OBJECT ${AVUTIL_SOURCES})
add_library(avfilter_src OBJECT ${AVFILTER_SOURCES})
add_library(avdevice_src OBJECT ${AVDEVICE_SOURCES})
add_library(swscale_src OBJECT ${SWSCALE_SOURCES})
add_library(swresample_src OBJECT ${SWRESAMPLE_SOURCES})
排除这些目标的实际构建
set_target_properties(
fftools_src avcodec_src avformat_src avutil_src
avfilter_src avdevice_src swscale_src swresample_src
PROPERTIES
EXCLUDE_FROM_ALL TRUE
)
message(STATUS "")
message(STATUS "FFmpeg Debug Configuration (Hybrid Mode)")
message(STATUS "")
message(STATUS "Using pre-compiled .o files from 'make' build")
message(STATUS "This avoids GCC/macOS compatibility issues")
message(STATUS "")
message(STATUS "To rebuild with debug symbols, run:")
message(STATUS " make clean")
message(STATUS " ./configure --enable-debug=3 --disable-optimizations")
message(STATUS " make -j8")
message(STATUS "")
message(STATUS "Note: GCC 14 on macOS has fixincludes issues with system headers.")
message(STATUS "The hybrid approach (make + CMake) works around this problem.")
message(STATUS "==================================================================")