Apple芯片MacOS上用CMake为Qt6程序打包FFmpeg遇问题
问题分析与解决方案
核心问题
- FFmpeg源码未完成构建:FetchContent仅负责拉取源码,FFmpeg需要通过自身
configure+make流程生成构建产物,avconfig.h就是构建时自动生成的文件,不存在于原始源码目录。 - 头文件路径配置错误:仅添加
libavutil等子目录,导致avutil.h中引用的<libavutil/avconfig.h>无法被编译器找到,需将FFmpeg根目录(或构建后的安装目录)加入包含路径。 - 链接配置错误:
target_link_libraries不应链接头文件,需链接编译生成的FFmpeg库文件(.a或.dylib)。
具体解决步骤
1. 调整CMake配置,自动构建FFmpeg
替换原FetchContent相关代码,添加FFmpeg的编译流程:
FetchContent_Declare( ffmpeg GIT_REPOSITORY https://github.com/FFmpeg/FFmpeg.git GIT_TAG n5.1.2 ) FetchContent_GetProperties(ffmpeg) if(NOT ffmpeg_POPULATED) FetchContent_Populate(ffmpeg) # 针对Apple芯片MacOS配置FFmpeg,按需调整编译选项 execute_process( COMMAND ./configure --prefix=${ffmpeg_BINARY_DIR} --enable-static --disable-shared --disable-programs --disable-doc --arch=arm64 WORKING_DIRECTORY ${ffmpeg_SOURCE_DIR} RESULT_VARIABLE ffmpeg_config_result ) if(NOT ffmpeg_config_result EQUAL 0) message(FATAL_ERROR "FFmpeg configure失败") endif() # 编译并安装FFmpeg到指定目录 execute_process( COMMAND make -j${CMAKE_BUILD_PARALLEL_LEVEL} install WORKING_DIRECTORY ${ffmpeg_SOURCE_DIR} RESULT_VARIABLE ffmpeg_build_result ) if(NOT ffmpeg_build_result EQUAL 0) message(FATAL_ERROR "FFmpeg编译失败") endif() endif()
2. 修正头文件与库链接配置
替换原include_directories和target_link_libraries:
# 添加FFmpeg安装后的头文件目录 target_include_directories(taqtie PRIVATE ${ffmpeg_BINARY_DIR}/include ) # 链接编译生成的FFmpeg静态库 target_link_libraries(taqtie PRIVATE ${ffmpeg_BINARY_DIR}/lib/libavutil.a ${ffmpeg_BINARY_DIR}/lib/libavcodec.a ${ffmpeg_BINARY_DIR}/lib/libavformat.a # 按需添加其他依赖库,如libavfilter、libswscale等 )
3. 调整源码中的头文件引用
保持extern "C"包裹逻辑,修改include路径(若已添加正确的包含目录,<avutil.h>也可正常使用,以下两种写法均可):
extern "C" { #ifndef __STDC_CONSTANT_MACROS #define __STDC_CONSTANT_MACROS #endif #include <libavutil/avutil.h> }
补充说明
- 若需要动态库,将configure参数中的
--enable-static --disable-shared改为--enable-shared --disable-static,链接时对应使用.dylib文件。 - 清理原CMake构建目录后重新运行配置,避免缓存残留问题。
内容的提问来源于stack exchange,提问作者AliOsm
相关产品推荐
相关产品推荐

