Windows下使用CMake构建FFmpeg依赖项目失败求助
看起来你遇到的核心问题是pkg-config无法定位FFmpeg的.pc配置文件,同时你的FFmpeg模块CMakeLists里还有几处拼写错误,我们一步步来解决:
一、先修正CMakeLists里的拼写错误
打开lib/FFmpeg/CMakeLists.txt,修改两处明显的笔误:
- 把
ASWRESAMPLE改成SWRESAMPLE(多打了个字母A) - 把
libswrescale改成libswscale(多了个字母c)
修正后的相关代码段:
pkg_check_modules(SWRESAMPLE REQUIRED IMPORTED_TARGET libswresample) pkg_check_modules(SWSCALE REQUIRED IMPORTED_TARGET libswscale)
二、让pkg-config能找到FFmpeg的.pc文件
CMD里能运行ffmpeg只说明它在系统PATH里,但pkg-config需要找到FFmpeg的.pc配置文件(这些文件记录了库的头文件路径和链接参数)。
步骤1:定位FFmpeg的pkgconfig目录
根据你提供的ffmpeg编译配置--prefix=/ffbuild/prefix,找到FFmpeg实际安装/解压后的目录,里面应该有个pkgconfig文件夹,里面包含libavcodec.pc、libavformat.pc等文件。比如路径可能是C:\ffmpeg\pkgconfig或者你自定义的安装路径。
步骤2:设置PKG_CONFIG_PATH环境变量
在运行CMake之前,先在CMD里设置环境变量,让pkg-config知道去哪里找这些.pc文件:
set PKG_CONFIG_PATH=你的FFmpeg安装目录\pkgconfig
举个例子,如果你的FFmpeg在D:\Programs\ffmpeg,那就是:
set PKG_CONFIG_PATH=D:\Programs\ffmpeg\pkgconfig
设置完成后再进入你的build目录运行cmake ..。
备选:在CMake里直接指定路径
如果你不想每次手动设置环境变量,可以在项目根目录的CMakeLists开头添加:
set(PKG_CONFIG_PATH "你的FFmpeg安装目录/pkgconfig" CACHE PATH "Path to FFmpeg pkgconfig files")
三、如果pkg-config还是不好用,试试直接指定FFmpeg路径(Windows环境更稳定)
有时候Windows下pkg-config的配置容易出问题,你可以跳过pkg-config,直接用CMake原生指令定位FFmpeg:
修改lib/FFmpeg/CMakeLists.txt为:
cmake_minimum_required(VERSION 3.14) project(FFmpeg) # 替换成你实际的FFmpeg安装路径 set(FFMPEG_ROOT "你的FFmpeg安装目录" CACHE PATH "FFmpeg root directory") # 查找头文件 find_path(AVCODEC_INCLUDE_DIR libavcodec/avcodec.h PATHS ${FFMPEG_ROOT}/include) find_path(AVFORMAT_INCLUDE_DIR libavformat/avformat.h PATHS ${FFMPEG_ROOT}/include) find_path(AVFILTER_INCLUDE_DIR libavfilter/avfilter.h PATHS ${FFMPEG_ROOT}/include) find_path(AVDEVICE_INCLUDE_DIR libavdevice/avdevice.h PATHS ${FFMPEG_ROOT}/include) find_path(AVUTIL_INCLUDE_DIR libavutil/avutil.h PATHS ${FFMPEG_ROOT}/include) find_path(SWRESAMPLE_INCLUDE_DIR libswresample/swresample.h PATHS ${FFMPEG_ROOT}/include) find_path(SWSCALE_INCLUDE_DIR libswscale/swscale.h PATHS ${FFMPEG_ROOT}/include) # 查找库文件 find_library(AVCODEC_LIBRARY avcodec PATHS ${FFMPEG_ROOT}/lib) find_library(AVFORMAT_LIBRARY avformat PATHS ${FFMPEG_ROOT}/lib) find_library(AVFILTER_LIBRARY avfilter PATHS ${FFMPEG_ROOT}/lib) find_library(AVDEVICE_LIBRARY avdevice PATHS ${FFMPEG_ROOT}/lib) find_library(AVUTIL_LIBRARY avutil PATHS ${FFMPEG_ROOT}/lib) find_library(SWRESAMPLE_LIBRARY swresample PATHS ${FFMPEG_ROOT}/lib) find_library(SWSCALE_LIBRARY swscale PATHS ${FFMPEG_ROOT}/lib) # 验证查找结果 foreach(_DIR AVCODEC_INCLUDE_DIR AVFORMAT_INCLUDE_DIR AVFILTER_INCLUDE_DIR AVDEVICE_INCLUDE_DIR AVUTIL_INCLUDE_DIR SWRESAMPLE_INCLUDE_DIR SWSCALE_INCLUDE_DIR) if(NOT ${_DIR}) message(FATAL_ERROR "Could not find ${_DIR}") endif() endforeach() foreach(_LIB AVCODEC_LIBRARY AVFORMAT_LIBRARY AVFILTER_LIBRARY AVDEVICE_LIBRARY AVUTIL_LIBRARY SWRESAMPLE_LIBRARY SWSCALE_LIBRARY) if(NOT ${_LIB}) message(FATAL_ERROR "Could not find ${_LIB}") endif() endforeach() add_library(FFmpeg INTERFACE IMPORTED GLOBAL) target_include_directories(FFmpeg INTERFACE ${AVCODEC_INCLUDE_DIR} ${AVFORMAT_INCLUDE_DIR} ${AVFILTER_INCLUDE_DIR} ${AVDEVICE_INCLUDE_DIR} ${AVUTIL_INCLUDE_DIR} ${SWRESAMPLE_INCLUDE_DIR} ${SWSCALE_INCLUDE_DIR} ) target_link_libraries(FFmpeg INTERFACE ${AVCODEC_LIBRARY} ${AVFORMAT_LIBRARY} ${AVFILTER_LIBRARY} ${AVDEVICE_LIBRARY} ${AVUTIL_LIBRARY} ${SWRESAMPLE_LIBRARY} ${SWSCALE_LIBRARY} )
替换FFMPEG_ROOT为你实际的FFmpeg安装路径,这种方式不依赖pkg-config,在Windows环境下兼容性更好。
最后验证
修改完成后,删除build目录下的所有文件,重新运行CMake配置,应该就能成功找到FFmpeg的库了。
内容的提问来源于stack exchange,提问作者BloodyFerret

