FFmpeg8.0.1 Mac环境 CMake本地调试配置

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 "==================================================================")

相关推荐
runner365.git26 分钟前
ffmpeg8.0合入whisper,语音识别模型终于进入ffmpeg
ffmpeg·whisper·语音识别
小鹿软件办公1 小时前
Apple 发布 macOS 11、watchOS 10 和 watchOS 9 更新
macos·objective-c·cocoa
小徐敲java1 天前
视频推流服务器与FFmpeg 安装配置
服务器·ffmpeg·音视频
chao_7891 天前
双设备全栈开发最佳实践[mac系统]
git·python·macos·docker·vue·全栈
2501_915921431 天前
不用 Xcode 上架 iOS,拆分流程多工具协作完成 iOS 应用的发布准备与提交流程
android·macos·ios·小程序·uni-app·iphone·xcode
Ron丶1 天前
iOS 旧版本 App 下载方法汇总:如何获取历史版本 IPA(2026 仍有效)
windows·经验分享·macos·ios·电脑
编程小风筝1 天前
MAC物理地址和IP网络地址有什么区别?
网络协议·tcp/ip·macos
假装我不帅2 天前
ffmpeg操作mp3去除封面信息
ffmpeg
雪域迷影2 天前
MacOS中运行Next.js项目注册新用户时MongoDB报错MongoServerError
mongodb·macos·react·next.js
西京刀客2 天前
macOS 打出来的 tar 包,Linux 常见告警(tar 包里带了 macOS 的扩展属性(xattr))
linux·运维·macos