Ubuntu18.04下CMake构建FFmpeg C++项目报错找不到-lpkgcfg_lib_LIBAV_stdc++
错误原因
你遇到的链接错误是Ubuntu 18.04自带的CMake 3.10版本对静态库pkg-config文件的私有依赖解析存在bug导致的:你编译FFmpeg时加了--pkg-config-flags="--static"参数,生成的FFmpeg相关pc文件中包含了libstdc++、libgcc_s等系统标准库依赖,旧版本CMake会把这些依赖当成需要通过pkgconfig查找的第三方库,找不到就会标记为NOTFOUND,导致链接失败。
解决方案
方案一:修改CMakeLists.txt适配旧版本CMake(推荐,无需重新编译FFmpeg)
无需改动FFmpeg配置,直接修改项目CMakeLists.txt即可修复bug:
cmake_minimum_required(VERSION 3.10) project(xsplay) find_package(PkgConfig REQUIRED) pkg_check_modules(LIBAV REQUIRED IMPORTED_TARGET libavdevice libavfilter libavformat libavcodec libswresample libswscale libavutil ) # 新增:修复旧版本CMake解析静态pkgconfig文件的bug,手动补充系统标准库依赖 set_target_properties(PkgConfig::LIBAV PROPERTIES INTERFACE_COMPILE_OPTIONS "${LIBAV_CFLAGS_OTHER}" INTERFACE_LINK_LIBRARIES "${LIBAV_LDFLAGS_OTHER};stdc++;gcc_s;gcc;pthread" ) add_executable(${PROJECT_NAME} main.cpp ) target_link_libraries(${PROJECT_NAME} PkgConfig::LIBAV )
方案二:不使用IMPORTED_TARGET写法(兼容性更好)
如果方案一仍不生效,可以换成更适配旧版本CMake的手动配置写法:
cmake_minimum_required(VERSION 3.10) project(xsplay) find_package(PkgConfig REQUIRED) pkg_check_modules(LIBAV REQUIRED libavdevice libavfilter libavformat libavcodec libswresample libswscale libavutil ) include_directories(${LIBAV_INCLUDE_DIRS}) link_directories(${LIBAV_LIBRARY_DIRS}) add_executable(${PROJECT_NAME} main.cpp) target_link_libraries(${PROJECT_NAME} ${LIBAV_LIBRARIES} pthread stdc++)
方案三:重新编译FFmpeg移除静态标记(适合不需要静态链接FFmpeg的场景)
如果不需要静态链接FFmpeg到你的项目,可以重新编译FFmpeg,去掉配置参数里的--pkg-config-flags="--static"即可,生成的pc文件不会携带额外的静态依赖,CMake可以正常解析。
编译注意事项
执行cmake命令前,需要先导出你自行编译的FFmpeg的pkgconfig路径,否则CMake会优先找到系统自带的旧版本FFmpeg:
# 清空build目录旧缓存 rm -rf build && mkdir build && cd build # 导入自定义FFmpeg的pkgconfig路径后执行cmake PKG_CONFIG_PATH=$HOME/ffmpeg_build/lib/pkgconfig cmake .. # 编译 make
内容的提问来源于stack exchange,提问作者yag
相关产品推荐
相关产品推荐

